一道关于C语言的题,求教,求指点。谢谢!

供稿:hz-xin.com     日期:2025-01-12
C语言的一道题 求指点

第一个代码, 你需要知道double每个数字都是近似存储的,虽然有前若干位是准确数字的说法,但实际上除了恰好是2^n组合的加法情况,其他的多少都会有一些近似.
这样在大量计算累积下来就会导致精度丢失的扩大. 最终导致结果错误.
第二个代码.
如果把c改成int应该是可以过的.
现在c是short 这样在做c=c*a; 的时候就可能会溢出.
比如 a=999; 计算第二次的时候 c=998001, 但最大值只是32767,所以实际上得到的c值是14961 取余后结果是961,明显和正确答案001差太多了.

楼主你好

21. 下列选项中合法的函数说明语句是()。
A) double func( int a, int b );
B) double func( int a, b );
C) double func( a, int b );
D) double func( a, b );

22. 设有定义int a[]={1,3,5,7,9},*p=a;结果为7的表达式是()。
A) *(p+3)
B) *(p+4)
C) *p+3
D) *p+4

23. 设有定义int m, n, *p; 与语句“m=n;”等价的语句是()。

A) p=&n; m=*p;

B) p=&m; n=*p;

C) p=*n; m=*p;

D) p=*m; n=*p;

24. 设有定义int m=2,n=5,*p=&n;则语句“m=*p;”的结果是()。
A) 指针p指向m
B) 变量m的值变为5
C) 变量n的值变为2
D) 指针p指向m,同时变量m的值变为5

25. 设有说明int n; char str[80];与函数调用:n=hex2dec(str); 则函数hex2dec正确的函数说明应该是:()。

A) int hex2dec(char str[]);

B) void hex2dec(char str[]);

C) int hex2dec(char str);

D) void hex2dec(char str);

26. 设有定义char *p[]={"Shanghai","Beijing","Honkong"};则结果为'j'字符的表达式是()。
A) p[3][1]
B) *(p[1]+3)
C) *(p[3]+1)
D) *p[1]+3

要提高效率,倒是可以~
不过挺麻烦
由于N值是确定的,那么M取值也很容易导出,比如N为6,那么M就只能取1,2,3,6(也就是可以整除N的素数,当然,1,6不是素数,也就是说除了本身和1以外,其它的取值都是素数)
当N,M值确定时,X的取值就是M*1,M*2,M*3(也就是M乘以素数的值),为保证M是最大公约数,这里的素数是不能整除(N/M)的。(1除外)也就是[1,N/M]区间的数素数的数量减去整除N/M的数量。
这样可以直接算出x的可取值个数,不用一个一个数的去检验。
不知道说明白了没~

//可以用欧几里德算法直接求出(x,n),然后和m比较,效率明显提高,但还远未达到1000ms的要求,n还不到1千万就超时了 (q9550 cpu)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
clock_t s;
int a,b,n,m,x,f,g;
int n1,x1;
scanf("%d",&a);
for(b=1;b<=a;b++)
{
g=0;
scanf("%d %d",&n,&m);
s=clock();
for(x=m;x<=n;x++)
{
x1=x;n1=n;
while(1)
{
n1=n1%x1;
if(n1==0)
{
f=x1;
break;
}
x1=x1%n1;
if(x1==0)
{
f=n1;
break;
}
}
if(f>=m)
{
//printf("%d %d ",x,f);
g++;
}

}
s=clock()-s;
printf("%d %dms\n",g,s);

}

return 0;
}

1
8888888 56
39096 1326ms
请按任意键继续. . .

release版本稍微快点,没有本质改变
1
8888888
56
39096 1107ms
请按任意键继续. . .

一道关于C语言的题,求教,求指点。谢谢!
由于N值是确定的,那么M取值也很容易导出,比如N为6,那么M就只能取1,2,3,6(也就是可以整除N的素数,当然,1,6不是素数,也就是说除了本身和1以外,其它的取值都是素数)当N,M值确定时,X的取值就是M*1,M*2,M*3(也就是M乘以素数的值),为保证M是最大公约数,这里的素数是不能...

有一个c语言的问题不会,求大神指教!!
break是跳出当前的包含 break的最近的一层循环。循环就是,因为a=1,已经赋值了,所以for的第一个没有,只写了一个分号,表示从a=1 开始,进行循环体的内容,如果a是偶数,则跳出for循环。如果不是偶数,则b=b+a,然后a= a+1,继续循环,这一次,a是偶数了,跳出for循环,所以后面那个b+=a就...

求c语言高手指点关于if函数的问题
说实话,第一种写法是不被推荐的,因为第一个 if 的括号里面的意思是:先运算 a > 0 ,再运算 b > 0 ,最后取 b > 0 的值(真或假,即非0或0)作为 if 的判断条件。逗号也是 C 语言中的运算符,在 C 语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别计算,但整个表达...

一道c语言题目 求大神指点下算法?
根据题意,随机生成红绿蓝球任意个数,并任意顺序排列。这里采用随机数实现。统计按红绿蓝顺序排列最少交换次数,我的思路是:第一步:循环将最后一个红色球与最靠前的其它两色球(并且满足位置在红球之前)交换。第二步:循环将最后一个绿球与最靠前的蓝球(必须在绿球之前)交换。include <stdio.h> ...

一道C语言数组的题目。求指点
1.首先一点是主函数写int main(),写void main()的话是错的,至于为什么就不要深究了吧,以后会懂的,现在给你说你也搞不懂,这就是规律,没办法。2.你这个地方肯定就是想从键盘输入一个数,而这个数也就是数组的长度。但是这样是不可以的,静态数组定义的时候必须指出它的大小,不然肯定会出错,...

c语言编程问题,求高手解答(高分)
你的程序没有大的问题,可以执行,只是以下几个小问题:一、第一行包含的文件不存在,这一行应该删除。二、定义了argc、argv两个变量没有使用,编译会有警告,可以删除他们或者不管,最好改为:int main()三、scanf输入n和k的时候,中间有个逗号分隔,这样输入的时候会麻烦,最好改为:scanf("%d%d...

C语言小题,求指点
int a=2;a%=4-1;\/\/相当于2%3,所以第一行输出2 --- 第二行输出是0,但是下面这种写法 a+=a*=a-=a*3;对于不同的编译器,运算结果是不同的,不建议这样写。

C语言,求指点!!
题目跟赋值表达式的值以及逗号运算符的特性有关,没有用到运算符优先级的知识(这种题只会在考试的时候出现,平时没有人这么编程的)首先看 printf 函数到底输出了什么,%d 对应的参数是 z=(x%y,x\/y),即输出表达式 z=(x%y,x\/y) 的值;于是接下看 z=(x%y,x\/y) 的值是多少,根据C语言标准...

C语言题,求高手指点!?
3.答案C 正确 4. 答案D 错误 s=p;是错误的 因为s是 一个整型数指针,而p是字符型指针。指针类型不同的两个变量不能赋值。=== 希望我的回答对你有所帮助,很高兴和你一起学习和讨论C语言编程。

下面有一些关于C语言问题,希望大伙儿侃侃,最好解释详细,谢谢呢?
第五题:8 4 void f(int y,int*x) X是按地址传,而Y是按值传,当值传到函数里时,*x可以改变X的值,而Y不能返回.保持原来的值...第六题:这是C语言的内存动态分配,不是很掌握,没有把握,希望其它好心人帮忙一下补齐.第七题:efgh 这道我简单说下,语言点太多,要是不明白,发消息给我,我就...