一道C语言的题目,跪求大神解答,拜托能不能解释一下运行过程

作者&投稿:定南 (若有异议请与网页底部的电邮联系)
C语言的一道题目,跪求大神每一步详细解答~

首先main函数不用说了吧?
main函数第一行中定义了四个整形变量:n, k, i, m。
从1处可以得知,n的含义是n依次存储从101到200的所有数字,以便程序判断这些数字是否为素数。
在1处的for循环体中,将k定义为了n的平方根。从后面我们也可以看出,该程序检验n是否为素数的方法是依次用2, 3, 4, ..., k去除n,如果有一个数能整除n,就说明n不是素数。那么为什么是一直除到k而不是除到n-1呢?这是因为:
如果我们已经证明在区间[2, sqrt(n)]之间没有数字能够整除n,那么对于任意一个大于sqrt(n)的整数,要使这个整数能够整除n,则n必然能够找到另外一个小于sqrt(n)的因子,但是这却与我们已经证到的结论矛盾,因此此时任意一个大于sqrt(n)的整数都必定无法整除n,因此判断一个数是否为素数,只需要从2一直除到sqrt(n)就可以了。
那么那个2处的i >= k+1是什么意思呢?
从第二个for循环可以得出这样一个结论:如果n为非素数,则肯定有一个整数i能够整除n,那么那个break语句肯定就会被执行一次。一旦执行了break语句,则i变量则永远不可能大于k(因为最后一个i++这条语句肯定得不到执行),也就是i永远不可能大于或等于k+1。反过来说,如果n为素数,则执行完第二个for循环后,i的值必定为k+1,因此if判断语句块内的内容就肯定能够被执行,从而输出素数n的内容,并且将输出控制变量m的值递增1。
那个m和d我估计应该是控制输出的格式,就是输出来以后每一行都是d个数字。

3, 2, 6, 5, 4, 1从右向左看到6的时候递减,所以要替换掉2,在1、4、5、6中4是刚刚比2大,所以4换掉2,然后6125数字从小到大排列。

#include<stdio.h>

int main()
{
    int i,p[3][3]={1,2,3,4,5,6,7,8,9},*p1[3],(*p2)[3];

// 二维数组p有3行,每行有3个整数.
// 应该写成int p[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };
// p等于0x28fee4,这是十六进制数,是内存地址,从这个内存地址开始,连续存放9个整数.

// p[0]等于0x28fee4,这是第0行的首地址,存放1,2,3这三个整数,每个整数占用内存4个字节,
//     其中,[0x28fee4]=p[0][0]=1,[0x28fee8]=p[0][1]=2,[0x28feec]=p[0][2]=3
// p[1]等于0x28fef0,这是第1行的首地址,存放4,5,6这三个整数,每个整数占用内存4个字节,
//     其中,[0x28fef0]=p[1][0]=4,[0x28fef4]=p[1][1]=5,[0x28fef8]=p[1][2]=6
// p[2]等于0x28fefc,这是第2行的首地址,存放7,8,9这三个整数,每个整数占用内存4个字节,
//     其中,[0x28fefc]=p[2][0]=7,[0x28ff00]=p[2][1]=8,[0x28ff04]=p[2][2]=9

    for(i=0;i<3;i++) p1[i]=p[i];

// int *p1[3]是"指针数组",是一种"数组",里面存放的是"指针",也就是存放"内存地址".
// 定义p1里的数字"3"表示能存放3个"指针",也就是3个"内存地址".
// i分别等于0,1,2
// i=0时,p1[0]等于p[0]=0x28fee4, p1[0]指向p的第0行的首地址,也就是指向{1,2,3}的首地址.
// i=1时,p1[1]等于p[1]=0x28fef0, p1[1]指向p的第1行的首地址,也就是指向{4,5,6}的首地址.
// i=2时,p1[2]等于p[2]=0x28fefc, p1[2]指向p的第2行的首地址,也就是指向{7,8,9}的首地址.

// p1等于0x28fed8,这是内存地址,
// 内存地址0x28fed8里连续存放了三个数据:0x28fee4,0x28fef0,0x28fefc
// *p1=*(p1+0)等于0x28fee4,也就是 *p1 = p1[0]=p[0]=0x28fee4
//                        也就是*p1指向二维数组p的第0行的首地址
// *(p1+1)等于0x28fef0,也就是 *(p1+1) = p1[1]=p[1]=0x28fef0
//                     也就是*(p1+1)指向二维数组p的第1行的首地址
// *(p1+2)等于0x28fefc,也就是 *(p1+2) = p1[2]=p[2]=0x28fefc
//                     也就是*(p1+2)指向二维数组p的第2行的首地址

// 所以,p1这个"指针数组",存放了三个内存地址 {0x28fee4,0x28fef0,0x28fefc},
// 也就是 {p[0],p[1],p[2]}.
// 这三个数据就是三个"指针",也就是三个"内存地址",分别是二维数组p的三行整数的首地址.

// 例如,*(p1+1)+0 指向 p[1] 的第0个整数4的内存地址
//      *(p1+1)+1 指向 p[1] 的第1个整数5的内存地址
//      *(p1+1)+2 指向 p[1] 的第2个整数6的内存地址

//      *(*(p1+0)+0) = p[0][0] = 1
//      *(*(p1+0)+1) = p[0][1] = 2
//      *(*(p1+0)+2) = p[0][2] = 3

//      *(*(p1+1)+0) = p[1][0] = 4
//      *(*(p1+1)+1) = p[1][1] = 5
//      *(*(p1+1)+2) = p[1][2] = 6

//      *(*(p1+2)+0) = p[2][0] = 7
//      *(*(p1+2)+1) = p[2][1] = 8
//      *(*(p1+2)+2) = p[2][2] = 9

    p2=p;

// int (*p2)[3]是"数组指针". 语句p2=p表示"数组指针"p2指向二维数据p的首地址.
// 定义p2里的数字"3"表示每行有3个整数.
// p2等于0x28fee4,这是内存地址,是二维数据p的首地址.

// *p2 = *(p2 + 0) = p[0] = 整数p[0][0]的内存地址
//       *(p2 + 1) = p[1] = 整数p[1][0]的内存地址
//       *(p2 + 2) = p[2] = 整数p[2][0]的内存地址

// *( *p2 + 0 ) = *( *(p2 + 0) + 0 ) = p[0][0] = 1
// *( *p2 + 1 ) = *( *(p2 + 0) + 1 ) = p[0][1] = 2
// *( *p2 + 2 ) = *( *(p2 + 0) + 2 ) = p[0][2] = 3

//                *( *(p2 + 1) + 0 ) = p[1][0] = 4
//                *( *(p2 + 1) + 1 ) = p[1][1] = 5
//                *( *(p2 + 1) + 2 ) = p[1][2] = 6

//                *( *(p2 + 2) + 0 ) = p[2][0] = 7
//                *( *(p2 + 2) + 1 ) = p[2][1] = 8
//                *( *(p2 + 2) + 2 ) = p[2][2] = 9

    for(i=1;i<3;i++)
    printf("%d,%d
",*(*(p1+i)+1)+1,*(*++p2+1)+1);

// i分别等于1,2

// i=1时, *(*(p1+i)+1)+1 = *(*(p1+1)+1)+1
// 其中,*(p1+1) 等于0x28fef0,也就是 *(p1+1) = p1[1]=p[1]=0x28fef0
// 也就是 *(p1+1) 指向二维数组p的第1行的第0个整数的内存地址
// 而 *(p1+1)+1 指向二维数组p的第1行的第1个整数的内存地址
// *(*(p1+1)+1)就是提取"第1行的第1个整数",也就是
// *(*(p1+1)+1) = p[1][1] = 5
// 所以,*(*(p1+1)+1) + 1 = 5 + 1 = 6 (这是屏幕输出的第一行第一个整数)

// 对于 *(*++p2+1) ,原本是 *( *(p2 + 0) + 1) = p[0][1] = 2
// 由于有"++p2"的运算,成为 *( *(p2 + 1) + 1 ) = p[1][1] = 5
// 所以, *(*++p2+1) + 1 = 5 + 1 =6 (这是屏幕输出的第一行第二个整数)

// i=2时, *(*(p1+i)+1)+1 = *(*(p1+2)+1)+1
// 其中,*(p1+2) 等于0x28fefc,也就是 *(p1+2) = p1[2]=p[2]=0x28fefc
// 也就是 *(p1+2) 指向二维数组p的第2行的第0个整数的内存地址
// 而 *(p1+2)+1 指向二维数组p的第2行的第1个整数的内存地址
// *(*(p1+2)+1)就是提取"第2行的第1个整数",也就是
// *(*(p1+2)+1) = p[2][1] = 8
// 所以,*(*(p1+2)+1) + 1 = 8 + 1 = 9 (这是屏幕输出的第二行第一个整数)

// 对于 *(*++p2+1) ,之前i等于1时,是 *( *(p2 + 1) + 1 )
// 由于有"++p2"的运算,现在成为 *( *(p2 + 2) + 1 ) = p[2][1] = 8
// 所以, *(*++p2+1) + 1 = 8 + 1 =9 (这是屏幕输出的第二行第二个整数)

// 所以,程序输出的第一行是6,6, 第二行是9,9

return 0;
}



一道C语言的题目,跪求大神解答,拜托能不能解释一下运行过程
7,8,9},*p1[3],(*p2)[3];\/\/ 二维数组p有3行,每行有3个整数.\/\/ 应该写成int p[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} };\/\/ p等于0x28fee4,这是十六进制数,是内存地址,从这个内存地址开始,连续存放9个整数.\/\/ p[0]等于0x28fee4,...

C语言题,我跪了
第一:你看题目,题目是输入一行数字字符,而你scanf("%d\/n",&a[i]);是输入数字了,而在命令行上你是这么输入的例子: 4 1 2 2 6 8 2 26 33 2 33 3 5 6 中间是有空格的,这样是输入多个数字,求每个数字出现的次数。第二:void cun(int*a,int*m) 最好不要用int *a int *...

计算机二级c语言实参形参一道题,跪求大神解答
这个函数是void型,在本题中实参传递给形参后,形参改变后的值无法传递回去,这一点回去翻下书,如果要改变值得话需要通过指针,所以对于结构体a来说,它里面的值依旧没有改变,所以答案选B

c语言问题,跪求大神解答 为什么10题中的a++在case1中直接就加上1了?而...
11题中,a要大于b,所以第一个if条件不成立,就直接打印输出了,没有执行C++,要记住,else是和最近的一个if做匹配

C语言 问题 跪求大神解答 请看照片
15是错的,字符串只能在初始化复制,这样的话只能一个一个赋值例如a[0]='1'之类的 19是对的,array1是一个存储了数组首个元素地址的指针,故赋值正确 20的说明看不见………但格式应该是没问题

C语言的考试题目,跪求高手解答,十分感谢十分感谢!!!
1、main( ){int i,j,m,n;i=8;j=10;m=++i;\/\/i自增为9,m=i=9 n=j++; \/\/先n=i=10,然后j自增1为11 printf("%d,%d,%d,%dn",i,j,n,m);} 程序运行( 9 )( 11)(10 )(9 )2. i=1、2时,i%3!=0,打印两次 i=3时,打印 i=4、5时。再打印两次 i=6时...

跪求大神解答一道C语言题
您好,很高兴回答您的问题。以上就是我的回答,希望能帮助到您。

一道关于c语言中 自加自减 算法的题目,菜鸟求解答。请结合实例说明一下...
以++x和x++为例,--同理。1、++x。x = 6;x = x + 1,这时x为7 return x;返回的是x自增后的值 2、x++ x = 6;tmp = x;这时x和tmp均为6 x = x + 1;这时x也为7 return tmp;返回的是x自增前的值。同理,自减也是这样。

C语言问题,跪求大神解答!--x. y++
结果:输出为“4,2,7#4,1,6”。解释:1)p(&x,y);printf("%d,%d,%d#",x,y,z);函数void p(int *x ,int y){ --*x;\/\/这句代码是将变量*x的地址指向区域的内存中的内容减1,此处x=5,&x为该变量所在内存的地址,作为参数传入函数p,--*x即是将&x位置的内存中的内容(此时...

C语言:!(x+y)+z-1 && y+z\/2 跪求高手解答 不胜感激。 谢谢!!
x+y)-z-1的值为0。(x+y)-z-1的值为0,则!(x+y)-z-1的值为1。先算z\/2,再算y+z\/2。若y+z\/2的值为0,那么整个表达式的值为0。若左边(x+y)-z-1的结果为1 ,y+z\/2的结果非零值,那么整个表达式的结果为1。其他情况,&&左右两边出现一个零,则整个表达式的结果为0。

康平县15686805060: 请教一道简单的C语言题目,求大神解答 -
后英齐克: 你没考虑到相邻两个数相等你情况.你看样例第四组数开头有两个7,输出是-1,说明严格递增是a[i+1]>=a[i],严格递减是a[i]>=a[i+1].

康平县15686805060: 一道c语言编程题,求大神指教! -
后英齐克: #include <stdio.h> void printdigits( int n ); int main() { int n; scanf("%d", &n); printdigits(n); return 0; } void printdigits( int n ) { if(n) { printdigits(n/10); printf("%d\n",n%10); } }

康平县15686805060: C语言的一道题目,求大神进? -
后英齐克: 12345678910 intfindchar(char**strings, intnum, charvalue){ inti, j, n = 0; for(i=0; i<num; i++) for(j=0; strings[i][j]; j++) if(strings[i][j] == value){ n++; break; } returnn; }

康平县15686805060: C语言的一道题目..求大神 -
后英齐克: #include <stdio.h> int is_prime(int x) {int i = 0;for(i = 2; i < x; i++) if (x % i==0) return 0;return 1; } void move (int *b, int n) {int * a = b;int * c = b;int d = 0;if(!b || n < 1) return ;while(c - b < n) {if(is_prime(*c)) {d = *a;*a = *c;*c = d;a++;}/*end ...

康平县15686805060: 一道C语言题目,请高手给详细解答: -
后英齐克: 1、从main()主函数开始从上往下执行函数2、执行到调用函数fun()后,结果是a=3,b=4,即px=3,py=43、由于是px、py是指针,px和 x指向同一个地址, py 和y也是一样的4、所以输出...

康平县15686805060: C语言的题目?求大神解答了~~~~~~~~~~~~~~题目如下 -
后英齐克: 楼主题目没问题,当输入2 4时,确实和为15.希望楼主采纳.#include<stdio.h>#define MAX 210 int Int[MAX]={2}; int is_prime(int x) { for (int i= 2; i*i <= x; i++) if (x % i == 0) return -1; return x; } int main() { int m,n; scanf("%d %d",&m,&n); int ...

康平县15686805060: 一道C语言题,跪求大神解答,我需要的是思路,谢谢! -
后英齐克: 从末尾向前数第一个减小的数a[position]在a[position]到a[N]中找出比a[position]大的最小的数a[index]a[position]和a[index]交换位置a[position+1]到a[N]从小到大排列#include<stdio.h>#define N 6int Find(int a[]);int Arrange(int a[],int i);int main(){ int i,...

康平县15686805060: 求C语言大神解一道题,在线等,谢谢啦~ -
后英齐克: #include int main(){ int i,j; for(i=0;i<5;i++){ //输出空格 for(j=0;j<5;j+...

康平县15686805060: 一道c语言的题 求大神帮忙 -
后英齐克: #include<stdio.h> void main() { char cbegin; //起始字符 int icount,i; //数量 printf("please input a char and a number: "); scanf("%c %d",&cbegin,&icount);//输入 printf("\nresult: "); for(i=0;i<icount;i++)printf("%c",cbegin+i); //输出printf("\n"); }

康平县15686805060: 一道c语言的很简单的题!求大神帮忙解答! -
后英齐克: 像平常数组排序一样.只是赋值的时候用strncpy就可以排序了.至于插入,,找个空的位置放进去 ,,然后再排一次......如果用链表的话..就构建链表把 都是基本的操作...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网