逻辑编程题
public static int [] getRemoveSame(int [] srcArray){
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < srcArray.length; i++) {
//如果list里族敬已经有数组的某个元素,槐桥则不添加到list中,进行兆明慎下次循环
if (list.contains(srcArray[i])) {
continue;
}
list.add(srcArray[i]);
}
int [] newArray = new int[list.size()];
int index = 0;
for (int a : list) {
newArray[index++] = a;
}
return newArray;
}
2. C语言程序 逻辑题应用
#include<stdio.h>
void main()
{
int f[4];//ABCD四人的标志依次设为f[0],f[1],f[2],f[3]
int A,B,C,D;
int i,cnt=0;
int ling=1;
f[0]=1;//假设A说的是实话,说橘帆实话则该人的标志为1,假话为0
if(f[0]==1)
{
D=ling;
A=B=C=!ling;
}//下面根据A的话,判断BCD说的是真话还是假话
if (A==ling)
f[1]=1;
else f[1]=0;
if (C!=ling)
f[2]=1;
else f[2]=0;
if(D!=ling)
f[3]=1;
else f[3]=0;
for(i=0;i<4;i++)
if(f[i]==1)
cnt++;
if(cnt==3)
{
printf("D is the leader!\n");
return;
}
cnt=0;
f[0]=0;//假设A说了假话;
f[1]=1;//假设B说了实磨码话;
D=!ling;
A=ling;
B=C=!ling;
if(C!=ling)
f[2]=1;
else f[2]=0;
if(D!=ling)
f[3]=1;
else
f[3]=0;
for(i=0;i<4;i++)
if(f[i]==1)
cnt++;
if(cnt==3)
{
printf("圆游雹A is the leader:\n");
return;
}
}
3. C++编程(逻辑推理)
貌似是和离散数学有关的,要先把命题符号化,然后进行推理,实际计算碧迅机执行的时候用真值表判断就可以了。。。
程序写的一般,没用什么美观界面之类的,这些你都可以自己加,算法有很多,我用了一个比较简单易于理解的。程序得出的答案是ACDB;你看看吧,有问题在问我。。。
#include<iostream>
#include<vector>
using namespace std;
bool isSimilar(int a[4][4],const vector<char> &answer)//该函数为判断得出的答案是否与四人中的一人答案相似
{//即,如果其中一人的回答与得出的答案中两个以上答案相同,则不符合每人只答对了一个;函数返回1
int count=0;
for(int i=0;i<4;i++)
{
count=0;
for(int j=0;j<4;j++)
{
if(a[i][j]==(answer[j]-'A'+1))count++;
}
if(count>=2)return 1;
}
return 0;
}
int main()
{
//answer[0],answer[1],answer[2],answer[3]分别代表甲乙丙丁;
//answer[x][0],answer[x][1],answer[x][2],answer[x][3]代表他们的答案
//1代表洞庭湖,2代表鄱阳湖,3代表洪泽湖,4代表太湖,-1代表任意答案
int an[4][4]={{1,-1,2,3},{3,2,4,1},{-1,-1,1,2},{2,3,1,4}};
vector<char> answer;
//A代表洞庭湖,B代表鄱阳湖,C代表洪泽湖,D代表太湖
answer.push_back('A');
answer.push_back('B');
answer.push_back('C');
answer.push_back('D');
//算法思想:得出答案的全排列举枣,然后根据题意只有一个人回答正确 逐个判读得出的答案是否符合题意
do{
if(answer[0]=='D')continue; //最大的湖根据题意只可能正慧拆是A,B,c
if(answer[1]=='A'||answer[1]=='D')continue;//第二大的湖根据题意只可能是B,c
if(answer[2]=='A'||answer[2]=='C')continue;//第三大的湖根据题意只可能是B,D
if(!isSimilar(an,answer))//根据题意没人只答对了一个,如果有人答对了两个以上也不符合题意, 删去
{
for(int i=0;i<4;i++)
cout<<answer[i];
break;
}
}while(next_permutation(answer.begin(),answer.end()));
system("pause");
}
4. C语言编程逻辑问题 输入精度e,用公式求cosx近似值,精确到最后一项绝对值小于e。
#include
#include
//
这个函数需要返回
double
类型,不然结凳圆培果很枣唯快就溢出了
double
f(int
n)
{
int
i;
double
m=1.0;
for(i=1;i<=n;i++)
m*=i;
return
m;
}
double
funcos(double
e,double
x)
{
int
i=0,flag=1;
double
cos=0,item=1.0;
while(fabs(item)>=e)
{
item=flag*pow(x,i)/f(i);
cos+=item;
flag=-flag;
//printf("%lf
%lf
%lf\n",pow(x,i),f(i),item);
i=i+2;
}
return
cos;
}
int
main()
{
double
e,x;
printf("e:
");
scanf("%lf",&e);
printf("x:
");
scanf("%lf",&x);
printf("cos(x)=%.3lf,standard
result=%.3lf\n"腔中,funcos(e,x),cos(x));
return
0;
}
5. C语言逻辑推理问题...帮忙解释程序
main() {
short a,b,c,d,j,t;
for (j = 0;j <=15;j++) { // 16次循环表示2的4次方
a = (j & 8) >> 3; // j和8按位与,然后右移三位
b = (j & 4) >> 2; //同上
c = (j & 2) >> 1;//同上
d = j & 1; //同上 不移位
t = (b + c + d == 1) + (!b && c) + (a + d == 1) + (!b && c);
//此处是四种表达式结果的和,其中 b+c+d==1 为例,即b+c+d如果等于1 那么这个表达式的值为1,否则为0,t即四个表达式的真值的和,用t的值来判断有几个是真的。
if ((t == 2) && (a + b + c + d == 1)) { //如果其中两个条件为真,即袭唯t=2,并且拆禅兄abcd的和为1
printf ("%d,%d,%d,%d\n"旅袭,a,b,c,d); //输出结果abcd
}
}
getch ();
}
6. C语言的逻辑题
(1)0;因为a+b>c为真,逻辑值是1,但b==c为假,逻辑值是0,&&表示“且”,所以该式值为0。
(2)1;因为a不为0,所以逻辑式a为真,同理b+c也为真,b-c也为真,所以该式值为者孝1。
(3)1;a>b为假,所以!(a>b)为真,c值不为零,所以!c的逻辑值是零,||表示“或粗滚”,1&&0||1为1。
(4)0;看后面&&0就知道是0了。
(5)1;!(a+b)的逻辑值是0,所以!(a+b)+c-1==0+5-1==4!=0,岩嫌余而b+c/2也不为零,所以该式为真。
7. 编程逻辑推理题难不难
您好,逻辑推理题难度确实较大,他需要备考人员有一定严密逻改宏辑思维,但是公务员考试中的逻辑思维题都是有一定规律可循的,仿旅首先建议您核大册关注中公图书商城,购买专业的逻辑推理教材,点拨您的思路,如果觉得自己学习难度仍较大,建议您可以报班学习,只要您的思路打开了,逻辑推理题难度不是很大的
8. 程序语言方面的问题,逻辑运算的一个题目。谢谢!
C吧,x and y其实已经决定了整个逻辑兆孙雹族帆表达式了,后面的or可以忽略,只要xandy为真整个表达凯察式几位真
9. C语言逻辑程序题
求最小.大 公倍数的他们答的不错
我颤氏哗就不 班门弄斧了 (说实话: 我没做过求最小.大 公倍数) 你看看我的这个 求怎么表达出某年的某个日期在当年是第几天???
是不是你想要的核猜结果
#include<stdio.h>
int f(int moon,int *m,int day)
{
int i;
for(i=0;i<moon;i++)
{
day+=m[i];
} day-=m[--moon];
return day;
}
main()
{
int print(int,int,int);
int year,moon,day;
printf("请茄行输入年,月,日:");
scanf("%d%d%d",&year,&moon,&day);
if(moon>=1 && moon<=12 && day>=1 && day<32)
print(year,moon,day);
else printf("enter error");
}
print(int year,int moon,int day)
{ int m[12];
printf("\n* %d \\ %d \\ %d\n",year,moon,day);
if (year%4==0 && year%100!=0 || year%400==0) /* 检验输入年份是否为闰年 */
m[1]=29;
else
m[1]=28;
m[0]=m[2]=m[4]=m[6]=m[7]=m[9]=m[11]=31;
m[3]=m[5]=m[8]=m[10]=30;
printf("这日为该年的第 %d 天",f(moon,m,day)); return 0;
}
有错的话 希望能加我QQ 355884441
10. 求C语言编程大佬帮忙!这道题的逻辑哪里出错了!找了几个小时了没搞明白!
代码有点乱,不太看得清思路,里面有一些数组越界访问的情况,算法是否有效未知,重写了一个供参考。
思路如下:
这个问题实际上是生成0~9的全排列,然后根据每个数在格子里的位置判断每个排列是否符合要求。网络了一个全排列算法稍做修改,得到以下代码,输出的有效方案数是1580,在我这里输出大约在70ms到100ms左右。网络这个代码排版垃圾得无以复加,vs里面排得好好复制过来全乱,不再重排了。
另外,生成排列数以后,这个格子问题其实应该能转化为纯数学算法来判断,不需要真的填什么表的,我懒得想太多,填表和判断部分的代码有点玩的性质。
#include<stdio.h>
//#include<time.h>//测试执行时间的GetTickCount()引用
//#include<Windows.h>//测试执行时间的GetTickCount()引用
constintROW=5;//增加两行用于减少边界判断,实际使用中间3行
constintCOL=6;//增加两列用于减少边界判断,实际使用中间4列
constintBORDER=-11;//表格边界标记
constintNON=-9;//标记表格有效内容的起止位置
intgrid[ROW][COL];//表格数组
intcount;//有效方案计数
voidInitGrid(void);//初始化表格,枣亮设置边界和标记表格有效内容的起止位置
voidPrintGrid(void);//打印输出有效方案
voidPerm(intlist[],intk,intm);//递归生成排列数,生成的排列数输出到表格中,然后判断是否打印和计数
voidSwap(int&a,int&b);//引用、交换函数,用于递归生成排列数函数
voidPermOutput(intlist[]);//排列数填表、判断、打印、计数
voidmain(void)
{
//longstart_time,end_time;//记录测试执行时间起止的变量
intnum[10]={0,1,2,3,4,5,6,7,8,9};//0~9数值序列
//start_time=GetTickCount();//获取此程序段开始执行时间
count=0;
InitGrid();
Perm(num,0,10);
//end_time=GetTickCount();//获取此程序段执行结束时间
//printf(" Count=%din%ldms ",count,end_time-start_time);//打印输出程序执行时间
getchar();
}
//初始化表格,设置边界和标记表格庆闹有效内容的起止位置
voidInitGrid(void)
{
inti,j;
for(i=0;i<ROW;i++)
{
for(j=0;j<COL;j++)
{
grid[i][j]=BORDER;//设置边界
}
}
//设置有效内容的起止位置
grid[1][1]=NON;
grid[ROW-2][COL-2]=NON;
}
//打印输出有效方案
voidPrintGrid(void)
{
inti,j;
printf("----------- ");
for(i=1;i<ROW-1;i++)
{
for(j=1;j<COL-1;j++)
{
if(grid[i][j]!=NON)
printf("%5d",grid[i][j]);//有效值
else
printf("%5s","");//有效值起止位置
}
printf(" ");
}
}
//递归生成排列数,生成的排列数输出到表格中,然后判断是否打印和计数
voidPerm(intlist[],intk,intm)//k表示前缀的位置,m是要排列的数目。
{
inti;
if(k==m-1)//前缀是最后一个位置,表示m位排列数已生成,判断是否有效方案并打印和记数。
{
PermOutput(list);
}
else//否则进入递归生成一下个排列数位
{
for(i=k;i<m;i++)
{
//交换前缀,使之产生下一个前缀.
Swap(list[k],list[i]);
Perm(list,k+1,m);
//将前缀换回来,继续做上一个的前缀排列.
Swap(list[k],list[i]);
}
}
}
//引用、交换函数,用于递凳差宽归生成排列数函数
voidSwap(int&a,int&b)
{
inttemp=a;a=b;b=temp;
}
//排列数填表、判断、打印、计数
voidPermOutput(intlist[])
{
inti,j,n;//n用于引用grid[i][j]的值提高效率
boolok;//方案有效标记
//将排列数填入表格中
n=0;
for(i=1;i<ROW-1;i++)
{
for(j=1;j<COL-1;j++)
{
if(grid[i][j]!=NON)
{
grid[i][j]=list[n];
n++;
}
}
}
//判断表格中是否有相邻的数字
ok=true;
for(i=1;i<ROW-1;i++)
{
for(j=1;j<COL-1;j++)
{
n=grid[i][j];
if((grid[i-1][j-1]==n-1)||((grid[i-1][j-1]==n+1))||//左上
(grid[i-1][j+1]==n-1)||((grid[i-1][j+1]==n+1))||//右上
(grid[i-1][j]==n-1)||((grid[i-1][j]==n+1))||//上
(grid[i][j-1]==n-1)||((grid[i][j-1]==n+1))||//左
(grid[i][j+1]==n-1)||((grid[i][j+1]==n+1))||//右
(grid[i+1][j]==n-1)||((grid[i+1][j]==n+1))||//下
(grid[i+1][j-1]==n-1)||((grid[i+1][j-1]==n+1))||//左下
(grid[i+1][j+1]==n-1)||((grid[i+1][j+1]==n+1))//右下
)
{
ok=false;//发现任一相邻数则设置失败标记,跳出该轮循环
break;
}
}
if(!ok)//如标记为失败,跳出外层循环
break;
}
//如标记为成功,方案有效,打印输出
if(ok)
{
//PrintGrid();//打印输出有效方案
count++;
}
}