赞
踩
程序分析:可填在百位、十位、个位的数字都是 1、2、3、4,组成所有的排列后再去掉不满足条件的排列。
#include<stdio.h> int main() { int i,j,k; printf("\n"); for(i=1;i<5;i++) { // 以下为三重循环 for(j=1;j<5;j++) { for (k=1;k<5;k++) { // 确保i、j、k三位互不相同 if (i!=k&&i!=j&&j!=k) { printf("%d,%d,%d\n",i,j,k); } } } } }
以上实例输出结果为:
1,2,3 1,2,4 1,3,2 1,3,4 1,4,2 1,4,3 2,1,3 2,1,4 2,3,1 2,3,4 2,4,1 2,4,3 3,1,2 3,1,4 3,2,1 3,2,4 3,4,1 3,4,2 4,1,2 4,1,3 4,2,1 4,2,3 4,3,1 4,3,2
从键盘输入当月利润I,求应发放奖金总数?
程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成双精度浮点(double)型。
#include<stdio.h> int main() { double i; double bonus1,bonus2,bonus4,bonus6,bonus10,bonus; printf("你的净利润是:\n"); scanf("%lf",&i); bonus1=100000*0.1; bonus2=bonus1+100000*0.075; bonus4=bonus2+200000*0.05; bonus6=bonus4+200000*0.03; bonus10=bonus6+400000*0.015; if(i<=100000) { bonus=i*0.1; } else if(i<=200000) { bonus=bonus1+(i-100000)*0.075; } else if(i<=400000) { bonus=bonus2+(i-200000)*0.05; } else if(i<=600000) { bonus=bonus4+(i-400000)*0.03; } else if(i<=1000000) { bonus=bonus6+(i-600000)*0.015; } else if(i>1000000) { bonus=bonus10+(i-1000000)*0.01; } printf("提成为:bonus=%lf",bonus); printf("\n"); }
以上实例输出结果为:
你的净利润是:
120000
提成为:bonus=11500.000000
程序分析:
假设该数为 x。
1、则:x + 100 = n2, x + 100 + 168 = m2
2、计算等式:m2 - n2 = (m + n)(m - n) = 168
3、设置: m + n = i,m - n = j,i * j =168,i 和 j 至少一个是偶数
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要么都是偶数,要么都是奇数。
5、从 3 和 4 推导可知道,i 与 j 均是大于等于 2 的偶数。
6、由于 i * j = 168, j>=2,则 1 < i < 168 / 2 + 1。
7、接下来将 i 的所有数字循环计算即可。
具体实现如下:
#include <stdio.h> int main (void) { int i, j, m, n, x; for (i = 1; i < 168 / 2 + 1; i++) { if (168 % i == 0) { j = 168 / i; if ( i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0) { m = (i + j) / 2; n = (i - j) / 2; x = n * n - 100; printf ("%d + 100 = %d * %d\n", x, n, n); printf ("%d + 268 = %d * %d\n", x, m, m); } } } return 0; }
以上实例输出结果为:
-99 + 100 = 1 * 1
-99 + 268 = 13 * 13
21 + 100 = 11 * 11
21 + 268 = 17 * 17
261 + 100 = 19 * 19
261 + 268 = 23 * 23
1581 + 100 = 41 * 41
1581 + 268 = 43 * 43
程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。
#include <stdio.h> int main() { int day,month,year,sum,leap; printf("\n请输入年、月、日,格式为:年,月,日(2015,12,10)\n"); scanf("%d,%d,%d",&year,&month,&day); // 格式为:2015,12,10 switch(month) // 先计算某月以前月份的总天数 { case 1:sum=0;break; case 2:sum=31;break; case 3:sum=59;break; case 4:sum=90;break; case 5:sum=120;break; case 6:sum=151;break; case 7:sum=181;break; case 8:sum=212;break; case 9:sum=243;break; case 10:sum=273;break; case 11:sum=304;break; case 12:sum=334;break; default:printf("data error");break; } sum=sum+day; // 再加上某天的天数 if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年 leap=1; } else { leap=0; } if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天 sum++; } printf("这是这一年的第 %d 天。",sum); printf("\n"); }
以上实例输出结果为:
请输入年、月、日,格式为:年,月,日(2015,12,10)
2015,10,1
这是这一年的第 274 天。
程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换,然后再用x与z进行比较,如果x>z则将x与z的值进行交换,这样能使x最小。
#include <stdio.h> int main() { int x,y,z,t; printf("\n请输入三个数字:\n"); scanf("%d%d%d",&x,&y,&z); if (x>y) { /*交换x,y的值*/ t=x;x=y;y=t; } if(x>z) { /*交换x,z的值*/ t=z;z=x;x=t; } if(y>z) { /*交换z,y的值*/ t=y;y=z;z=t; } printf("从小到大排序: %d %d %d\n",x,y,z); }
以上实例输出结果为:
请输入三个数字:
1
3
2
从小到大排序: 1 2 3
程序分析:可先用’*'号在纸上写出字母C,再分行输出。
程序源代码:
#include "stdio.h"
int main()
{
printf("用 * 号输出字母 C!\n");
printf(" ****\n");
printf(" *\n");
printf(" * \n");
printf(" ****\n");
}
以上实例输出结果为:
用 * 号输出字母 C!
****
*
*
****
程序分析:字符共有256个。不同字符,图形不一样。
VC6.0下出现中文乱码(原因+解决方法):
176的16进制是B0,219的16进制是DB,0xB0DB是"佰"字的内码,所以输出的就是"佰"了。
主要原因是文件信息的代码页不同,我们所使用的操作系统中文状态下的代码页,要显示扩展的ASCII码需要在437 OEM-美国这个下面显示,这样就可以显示出你所希望的。具体修改控制台的默认代码页步骤如下:
#include<stdio.h>
int main()
{
char a=176,b=219;
printf("%c%c%c%c%c\n",b,a,a,a,b);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",a,a,b,a,a);
printf("%c%c%c%c%c\n",a,b,a,b,a);
printf("%c%c%c%c%c\n",b,a,a,a,b);
return 0;
}
以上实例输出结果为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I15dxGHg-1665651728902)(C:\Users\11910\AppData\Roaming\Typora\typora-user-images\image-20221013110321372.png)]
程序分析:分行与列考虑,共 9 行 9 列,i 控制行,j 控制列。
程序源代码:
#include<stdio.h>
int main()
{
int i,j,result;
printf("\n");
for (i=1;i<10;i++)
{
for(j=1;j<=i;j++)
{
result=i*j;
printf("%d*%d=%-3d",i,j,result); /*-3d表示左对齐,占3位*/
}
printf("\n"); /*每一行后换行*/
}
}
以上实例输出结果为:
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
程序分析:国际象棋棋盘由64个黑白相间的格子组成,分为8行*8列。用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格。
如果出现乱码情况请参考本博客【C 练习实例7】的解决方法。
#include<stdio.h>
int main()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
if((i+j)%2==0)
printf("%c%c",219,219);
else printf(" ");
printf("\n");
}
return 0;
}
以上实例输出结果为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7pW5QtlS-1665651728903)(C:\Users\11910\AppData\Roaming\Typora\typora-user-images\image-20221013110653196.png)]
程序分析:用 ASCII 1 来输出笑脸;用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数。
如果出现乱码情况请参考【C 练习实例7】的解决方法。
#include<stdio.h>
int main()
{
int i,j;
printf("\1\1\n"); /*输出两个笑脸*/
for(i=1;i<11;i++)
{
for(j=1;j<=i;j++)
printf("%c%c",219,219);
printf("\n");
}
return 0;
}
以上实例输出结果为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hE1u5geh-1665651728903)(C:\Users\11910\AppData\Roaming\Typora\typora-user-images\image-20221013110748898.png)]
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21…,即下个月是上两个月之和(从第三个月开始)。
#include<stdio.h>
int main()
{
int f1=1,f2=1,i;
for(i=1;i<=20;i++)
{
printf("%12d%12d",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
f2=f1+f2;
}
return 0;
}
以上实例输出结果为:
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 5702887 9227465 14930352
24157817 39088169 63245986 102334155
程序分析:判断素数的方法:用一个数分别去除 2 到 sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
#include <stdio.h> int main() { int i,j; int count=0; for (i=101; i<=200; i++) { for (j=2; j<i; j++) { // 如果 j 能被 i 整除再跳出循环 if (i%j==0) break; } // 判断循环是否提前跳出,如果 j<i 说明在 2~j 之间,i 有可整除的数 if (j>=i) { count++; printf("%d ",i); // 换行,用 count 计数,每五个数换行 if (count % 5 == 0) printf("\n"); } } return 0; }
以上实例输出结果为:
101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
179 181 191 193 197
199
程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。
#include<stdio.h> int main() { int i,x,y,z; for(i=100;i<1000;i++) { x=i%10; y=i/10%10; z=i/100%10; if(i==(x*x*x+y*y*y+z*z*z)) printf("%d\n",i); } return 0; }
以上实例输出结果为:
153
370
371
407
程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:
#include<stdio.h> int main() { int n,i; printf("请输入整数:"); scanf("%d",&n); printf("%d=",n); for(i=2;i<=n;i++) { while(n%i==0) { printf("%d",i); n/=i; if(n!=1) printf("*"); } } printf("\n"); return 0; }
以上实例输出结果为:
请输入整数:90
90=2*3*3*5
程序分析:(a>b)?a:b这是条件运算符的基本例子。
#include<stdio.h>
int main()
{
int score;
char grade;
printf("请输入分数: ");
scanf("%d",&score);
grade=(score>=90)?'A':((score>=60)?'B':'C');
printf("%c\n",grade);
return 0;
}
以上实例输出结果为:
请输入分数: 87
B
程序分析:
(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;
(2)求最大公约数用辗转相除法(又名欧几里德算法)
1)证明:设c是a和b的最大公约数,记为c=gcd(a,b),a>=b,
令r=a mod b
设a=kc,b=jc,则k,j互素,否则c不是最大公约数
据上,r=a-mb=kc-mjc=(k-mj)c
可知r也是c的倍数,且k-mj与j互素,否则与前述k,j互素矛盾,
由此可知,b与r的最大公约数也是c,即gcd(a,b)=gcd(b,a mod b),得证。
2)算法描述:
第一步:a ÷ b,令r为所得余数(0≤r 第二步:互换:置 a←b,b←r,并返回第一步。
#include<stdio.h> int main() { int a,b,t,r,n; printf("请输入两个数字:\n"); scanf("%d %d",&a,&b); if(a<b) {t=b;b=a;a=t;} r=a%b; n=a*b; while(r!=0) { a=b; b=r; r=a%b; } printf("这两个数的最大公约数是%d,最小公倍数是%d\n",b,n/b); return 0; }
以上实例输出结果为:
请输入两个数字:
12 26
这两个数的最大公约数是2,最小公倍数是156
程序分析:利用while语句,条件为输入的字符不为’\n’。
#include<stdio.h> int main() { char c; int letters=0,spaces=0,digits=0,others=0; printf("请输入一些字母:\n"); while((c=getchar())!='\n') { if((c>='a'&&c<='z')||(c>='A'&&c<='Z')) letters++; else if(c>='0'&&c<='9') digits++; else if(c==' ') spaces++; else others++; } printf("字母=%d,数字=%d,空格=%d,其他=%d\n",letters,digits,spaces,others); return 0; }
以上实例输出结果为:
请输入一些字母:
www.runoob.com 123
字母=12,数字=3,空格=1,其他=2
程序分析:关键是计算出每一项的值。
#include<stdio.h> int main() { int s=0,a,n,t; printf("请输入 a 和 n:\n"); scanf("%d%d",&a,&n); t=a; while(n>0) { s+=t; a=a*10; t+=a; n--; } printf("a+aa+...=%d\n",s); return 0; }
以上实例输出结果为:
请输入 a 和 n:
2 5
a+aa+...=24690
程序分析:
#include<stdio.h> #define N 1000 int main() { int i,j,k,n,sum; int a[256]; for(i=2;i<=N;i++) { sum=a[0]=1; k=0; for(j=2;j<=(i/2);j++) { if(i%j==0) { sum+=j; a[++k]=j; } } if(i==sum) { printf("%d=%d",i,a[0]); for(n=1;n<=k;n++) printf("+%d",a[n]); printf("\n"); } } return 0; }
以上实例输出结果为:
6=1+2+3
28=1+2+4+7+14
496=1+2+4+8+16+31+62+124+248
程序分析:见下面注释。
程序源代码:
#include<stdio.h>
int main()
{
float h,s;
h=s=100;
h=h/2; //第一次反弹高度
for(int i=2;i<=10;i++)
{
s=s+2*h;
h=h/2;
}
printf("第10次落地时,共经过%f米,第10次反弹高%f米\n",s,h);
return 0;
}
以上实例输出结果为:
第10次落地时,共经过299.609375米,第10次反弹高0.097656米
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。
x2=x1/2-1, x1=(x2+1)*2
x3=x2/2-1, x2=(x3+1)*2
以此类推: x前=(x后+1)*2
程序源代码:
#include <stdio.h>
#include <stdlib.h>
int main(){
int day, x1 = 0, x2;
day=9;
x2=1;
while(day>0) {
x1=(x2+1)*2; // 第一天的桃子数是第2天桃子数加1后的2倍
x2=x1;
day--;
}
printf("总数为 %d\n",x1);
return 0;
}
以上实例输出结果为:
总数为 1534
#include <stdio.h> #include <stdlib.h> int main() { char i,j,k; for(i='x';i<='z';i++) { for(j='x';j<='z';j++) { if(i!=j) { for(k='x';k<='z';k++) { if(i!=k&&j!=k) { if(i!='x'&&k!='x'&&k!='z') { printf("顺序为:a--%c\tb--%c\tc--%c\n",i,j,k); } } } } } } }
以上实例输出结果为:
顺序为:a--z b--x c--y
*
***
*****
*******
*****
***
*
程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
程序源代码:
#include <stdio.h> int main() { int i,j,k; for(i=0;i<=3;i++) { for(j=0;j<=2-i;j++) { printf(" "); } for(k=0;k<=2*i;k++) { printf("*"); } printf("\n"); } for(i=0;i<=2;i++) { for(j=0;j<=i;j++) { printf(" "); } for(k=0;k<=4-2*i;k++) { printf("*"); } printf("\n"); } }
以上实例输出结果为:
*
***
*****
*******
*****
***
*
程序分析:请抓住分子与分母的变化规律。
程序源代码:
#include <stdio.h> int main() { int i,t; float sum=0; float a=2,b=1; for(i=1;i<=20;i++) { sum=sum+a/b; t=a; a=a+b; b=t; } printf("%9.6f\n",sum); }
以上实例输出结果为:
32.660263
程序分析:此程序只是把累加变成了累乘。
#include <stdio.h>
int main()
{
int i;
long double sum,mix;
sum=0,mix=1;
for(i=1;i<=20;i++)
{
mix=mix*i;
sum=sum+mix;
}
printf("%Lf\n",sum);
}
以上实例输出结果为:
2561327494111820313.000000
程序分析:递归公式:fn=fn_1*4!
#include <stdio.h> int main() { int i; int fact(int); for(i=0;i<6;i++){ printf("%d!=%d\n",i,fact(i)); } } int fact(int j) { int sum; if(j==0){ sum=1; } else { sum=j*fact(j-1); } return sum; }
以上实例输出结果为:
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
程序分析:无。
#include <stdio.h> int main() { int i=5; void palin(int n); printf("请输入5个字符\40:\40"); palin(i); printf("\n"); } void palin(n) int n; { char next; if(n<=1) { next=getchar(); printf("相反顺序输出结果\40:\40"); putchar(next); } else { next=getchar(); palin(n-1); putchar(next); } }
以上实例输出结果为:
请输入5个字符 : abcde
相反顺序输出结果 : edcba
程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。。
#include <stdio.h>
int age(n)
int n;
{
int c;
if(n==1) c=10;
else c=age(n-1)+2;
return(c);
}
int main()
{
printf("%d\n",age(5));
}
以上实例输出结果为:
18
程序分析:学会分解出每一位数,如下解释。
#include <stdio.h> int main( ) { long a,b,c,d,e,x; printf("请输入 5 位数字:"); scanf("%ld",&x); a=x/10000; /*分解出万位*/ b=x%10000/1000; /*分解出千位*/ c=x%1000/100; /*分解出百位*/ d=x%100/10; /*分解出十位*/ e=x%10; /*分解出个位*/ if (a!=0){ printf("为 5 位数,逆序为: %ld %ld %ld %ld %ld\n",e,d,c,b,a); } else if(b!=0) { printf("为 4 位数,逆序为: %ld %ld %ld %ld\n",e,d,c,b); } else if(c!=0) { printf("为 3 位数,逆序为:%ld %ld %ld\n",e,d,c); } else if(d!=0) { printf("为 2 位数,逆序为: %ld %ld\n",e,d); } else if(e!=0) { printf("为 1 位数,逆序为:%ld\n",e); } }
以上实例输出结果为:
请输入 5 位数字:12345
为 5 位数,逆序为: 5 4 3 2 1
程序分析:学会分解出每一位数。
程序源代码:
#include <stdio.h> int main( ) { long ge,shi,qian,wan,x; printf("请输入 5 位数字:"); scanf("%ld",&x); wan=x/10000; /*分解出万位*/ qian=x%10000/1000; /*分解出千位*/ shi=x%100/10; /*分解出十位*/ ge=x%10; /*分解出个位*/ if (ge==wan&&shi==qian) { /*个位等于万位并且十位等于千位*/ printf("这是回文数\n"); } else { printf("这不是回文数\n"); } }
以上实例输出结果为:
请输入 5 位数字:12321
这是回文数
请输入 5 位数字:12345
这不是回文数
程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母。
#include<stdio.h> int main() { char i,j; printf("请输入第一个字母:\n"); scanf("%c",&i); getchar();//scanf("%c",&j);的问题,第二次是读入的一个换行符,而不是输入的字符,因此需要加一个getchar() 吃掉换行符 switch(i) { case 'm': printf("monday\n"); break; case 'w': printf("wednesday\n"); break; case 'f': printf("friday\n"); break; case 't': printf("请输入下一个字母\n"); scanf("%c",&j); if (j=='u') {printf("tuesday\n");break;} if (j=='h') {printf("thursday\n");break;} case 's': printf("请输入下一个字母\n"); scanf("%c",&j); if (j=='a') {printf("saturday\n");break;} if (j=='u') {printf("sunday\n"); break;} default : printf("error\n"); break; } return 0; }
以上实例输出结果为:
请输入第一个字母:
s
请输入下一个字母
a
saturday
**程序分析:**无。
#include<stdio.h> #include<stdlib.h> #include<string.h> // 删除字符串中指定字母函数 char* deleteCharacters(char * str, char * charSet) { int hash [256]; if(NULL == charSet) return str; for(int i = 0; i < 256; i++) hash[i] = 0; for(int i = 0; i < strlen(charSet); i++) hash[charSet[i]] = 1; int currentIndex = 0; for(int i = 0; i < strlen(str); i++) { if(!hash[str[i]]) str[currentIndex++] = str[i]; } str[currentIndex] = '\0'; return str; } int main() { char s[2] = "a"; // 要删除的字母 char s2[5] = "aca"; // 目标字符串 printf("%s\n", deleteCharacters(s2, s)); return 0; }
以上实例输出结果为:
c
题目33:判断一个数字是否为质数。
程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
程序源代码:
#include<stdio.h> #include<math.h> #define MAX 1000 int prime[MAX]; int isPrimeNaive(int n) { if(n <= 1) return 0; for(int i = 2; i < n; i++) if(n % i == 0) return 0; return 1; } int isPrime(int n) { if(n<= 1) return 0; if(n == 2) return 1; if(n%2 == 0) return 0; int limit = (int)sqrt((double)n); for(int i = 3; i <= limit; i=i+2) { if(n % i == 0) return 0; } return 1; } void sieve() { prime[0] = 0; prime[1] = 0; for(int i = 2; i < MAX; i++) prime[i] = 1; int limit = (int)sqrt((double)MAX); for(int i = 2; i <= limit; i++) { if(prime[i]) for(int j = i*i; j <= MAX; j+=i) prime[j] = 0; } } //int isPrimeSieve(int n) //{ // if(prime[n]) // return 1; // else // return 0; //} int main() { // // 方法1 // sieve(); // int t; // for(int i=1;i<MAX;i++){ // printf("N=%d %d,",i,prime[i]); // if(i%10==0) // printf("\n"); // } // //方法2 // printf("N=%d %d\n", 1, isPrime(1)); // printf("N=%d %d\n", 2, isPrime(2)); // printf("N=%d %d\n", 3, isPrime(3)); // printf("N=%d %d\n", 4, isPrime(4)); // printf("N=%d %d\n", 7, isPrime(7)); // printf("N=%d %d\n", 9, isPrime(9)); // printf("N=%d %d\n", 13, isPrime(13)); // printf("N=%d %d\n", 17, isPrime(17)); // printf("N=%d %d\n", 100, isPrime(100)); // printf("N=%d %d\n", 23, isPrime(23)); // printf("N=%d %d\n", 1, isPrime(1)); //方法3 printf("N=%d %d\n", 1, isPrimeNaive(1)); printf("N=%d %d\n", 2, isPrimeNaive(2)); printf("N=%d %d\n", 3, isPrimeNaive(3)); printf("N=%d %d\n", 4, isPrimeNaive(4)); printf("N=%d %d\n", 7, isPrimeNaive(7)); printf("N=%d %d\n", 9, isPrimeNaive(9)); printf("N=%d %d\n", 13, isPrimeNaive(13)); printf("N=%d %d\n", 17, isPrimeNaive(17)); printf("N=%d %d\n", 100, isPrimeNaive(100)); printf("N=%d %d\n", 23, isPrimeNaive(23)); printf("N=%d %d\n", 1, isPrimeNaive(1)); return 0; }
程序分析:无。
程序源代码:
#include <stdio.h>
void hello_world(void)
{
printf("Hello, world!\n");
}
void three_hellos(void)
{
int counter;
for (counter = 1; counter <= 3; counter++)
hello_world();/*调用此函数*/
}
int main(void)
{
three_hellos();/*调用此函数*/
}
以上实例输出结果为:
Hello, world!
Hello, world!
Hello, world!
程序分析:无。
#include <stdio.h> void reverse(char* s) { // 获取字符串长度 int len = 0; char* p = s; while (*p != 0) { len++; p++; } // 交换 ... int i = 0; char c; while (i <= len / 2 - 1) { c = *(s + i); *(s + i) = *(s + len - 1 - i); *(s + len - 1 - i) = c; i++; } } int main() { char s[] = "www.runoob.com"; printf("'%s' =>\n", s); reverse(s); // 反转字符串 printf("'%s'\n", s); return 0; }
以上实例输出结果为:
'www.runoob.com' =>
'moc.boonur.www'
程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。
程序源代码:
#include<stdio.h> #include<math.h> int main() { int i,j,k,n=0; for(i=2;i<=100;i++) { k=(int)sqrt(i); for(j=2;j<=k;j++) if(i%j==0) break; if(j>k) { printf("%d ",i); n++; if(n%5==0) printf("\n"); } } return 0; }
以上实例输出结果为:
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 61 67 71
73 79 83 89 97
程序分析:可以利用选择法,即从后9个比较过程中,选择一个最小的与第一个元素交换, 下次类推,即用第二个元素与后8个进行比较,并进行交换。
#include<stdio.h> #define N 10 int main() { int i,j,a[N],temp; printf("请输入 10 个数字:\n"); for(i=0;i<N;i++) scanf("%d",&a[i]); for(i=0;i<N-1;i++) { int min=i; for(j=i+1;j<N;j++) if(a[min]>a[j]) min=j; if(min!=i) { temp=a[min]; a[min]=a[i]; a[i]=temp; } } printf("排序结果是:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }
以上实例输出结果为:
请输入 10 个数字:
23 2 27 98 234 1 4 90 88 34
排序结果是:
1 2 4 23 27 34 88 90 98 234
程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。
#include<stdio.h>
#define N 3
int main()
{
int i,j,a[N][N],sum=0;
printf("请输入矩阵(3*3):\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
for(i=0;i<N;i++)
sum+=a[i][i];
printf("对角线之和为:%d\n",sum);
return 0;
}
以上实例输出结果为:
请输入矩阵(3*3):
1 2 3
4 5 6
7 8 9
对角线之和为:15
程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移一个位置。
#include<stdio.h> int main() { int a[11]={1,4,6,9,13,16,19,28,40,100}; int temp1,temp2,number,end,i,j; printf("原始数组是:\n"); for(i=0;i<10;i++) printf("%4d",a[i]); printf("\n插入一个新的数字: "); scanf("%d",&number); end=a[9]; if(number>end) a[10]=number; else { for(i=0;i<10;i++) { if(a[i]>number) { temp1=a[i]; a[i]=number; for(j=i+1;j<11;j++) { temp2=a[j]; a[j]=temp1; temp1=temp2; } break; } } } for(i=0;i<11;i++) printf("%4d",a[i]); printf("\n"); return 0; }
以上实例输出结果为:
原始数组是:
1 4 6 9 13 16 19 28 40 100
插入一个新的数字: 10
1 4 6 9 10 13 16 19 28 40 100
程序分析:用第一个与最后一个交换。
程序源代码:
#include<stdio.h> #define N 10 int main() { int a[N]={0,1,2,3,4,5,6,7,8,9}; int i,t; printf("原始数组是:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); for(i=0;i<N/2;i++) { t=a[i]; a[i]=a[N-1-i]; a[N-1-i]=t; } printf("\n排序后的数组:\n"); for(i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }
以上实例输出结果为:
原始数组是:
0 1 2 3 4 5 6 7 8 9
排序后的数组:
9 8 7 6 5 4 3 2 1 0
程序分析:无。
#include<stdio.h> int main() { void fun(); for(int i=0;i<3;i++) fun(); return 0; } void fun() { int i=0; static int static_i=0; printf("i=%d\n",i); printf("static_i=%d\n",static_i); i++; static_i++; }
以上实例输出结果为:
i=0
static_i=0
i=0
static_i=1
i=0
static_i=2
程序分析:无。
程序源代码:
#include <stdio.h> int main() { int i,num; num=2; for(i=0;i<3;i++) { printf("num 变量为 %d \n",num); num++; { auto int num=1; printf("内置模块 num 变量为 %d \n",num); num++; } } return 0; }
以上实例输出结果为:
num 变量为 2
内置模块 num 变量为 1
num 变量为 3
内置模块 num 变量为 1
num 变量为 4
内置模块 num 变量为 1
程序分析:无。
程序源代码:
#include <stdio.h> int main() { int i,num; num=2; for(i=0;i<3;i++) { printf("num 变量为 %d \n",num); num++; { static int num=1; printf("内置模块 num 变量为 %d\n",num); num++; } } return 0; }
以上实例输出结果为:
num 变量为 2
内置模块 num 变量为 1
num 变量为 3
内置模块 num 变量为 2
num 变量为 4
内置模块 num 变量为 3
程序分析:无。
程序源代码:
#include <stdio.h>
int a,b,c;
void add()
{
int a;
a=3;
c=a+b;
}
int main()
{
a=b=4;
add();
printf("c 的值为 %d\n",c);
return 0;
}
以上实例输出结果为:
c 的值为 7
程序分析:无。
程序源代码:
#include <stdio.h>
int main()
{
register int i;
int tmp=0;
for(i=1;i<=100;i++)
tmp+=i;
printf("总和为 %d\n",tmp);
return 0;
}
以上实例输出结果为:
总和为 5050
程序分析:无。
程序源代码:
#include<stdio.h> #define TRUE 1 #define FALSE 0 #define SQ(x) (x)*(x) int main() { int num; int again=1; printf("如果值小于 50 程序将终止。\n"); while(again) { printf("\n请输入数字:"); scanf("%d",&num); printf("该数字的平方为 %d \n",SQ(num)); if(num>=50) again=TRUE; else again=FALSE; } return 0; }
以上实例输出结果为:
如果值小于 50 程序将终止。
请输入数字:100
该数字的平方为 10000
请输入数字:5
该数字的平方为 25
程序分析:无。
程序源代码:
#include<stdio.h>
#define exchange(a,b) { int t;t=a;a=b;b=t;}//注意放在一行里
int main()
{
int x=10;
int y=20;
printf("x=%d; y=%d\n",x,y);
exchange(x,y);
printf("x=%d; y=%d\n",x,y);
return 0;
}
以上实例输出结果为:
x=10; y=20
x=20; y=10
程序分析:无。
程序源代码:
#define LAG > #define SMA < #define EQ == #include <stdio.h> int main() { int i,j; printf("请输入两个数字:\n"); scanf("%d %d",&i,&j); if(i LAG j) printf("%d 大于 %d \n",i,j); else if(i EQ j) printf("%d 等于 %d \n",i,j); else if(i SMA j) printf("%d 小于 %d \n",i,j); else printf("没有值。\n"); return 0; }
以上实例输出结果为:
请输入两个数字:
1 2
1 小于 2
程序分析:无。
程序源代码:
#include<stdio.h> #define MAX #define MAXIMUM(x,y)(x>y)?x:y #define MINIMUM(x,y) (x>y)?y:x int main() { int a=10,b=20; #ifdef MAX printf("更大的数字是 %d\n",MAXIMUM(a,b)); #else printf("更小的数字是 %d\n",MINIMUM(a,b)); #endif #ifndef MIN printf("更小的数字是 %d\n",MINIMUM(a,b)); #else printf("更大的数字是 %d\n",MAXIMUM(a,b)); #endif #undef MAX #ifdef MAX printf("更大的数字是 %d\n",MAXIMUM(a,b)); #else printf("更小的数字是 %d\n",MINIMUM(a,b)); #endif #define MIN #ifndef MIN printf("更小的数字是 %d\n",MINIMUM(a,b)); #else printf("更大的数字是 %d\n",MAXIMUM(a,b)); #endif return 0; }
以上实例输出结果为:
更大的数字是 20
更小的数字是 10
更小的数字是 10
更大的数字是 20
程序分析:无。
程序源代码:
test.h 文件代码如下
#define LAG >
#define SMA <
#define EQ ==
主文件代码:
#include "test.h" #include <stdio.h> int main() { int i=10; int j=20; if(i LAG j) printf("%d 大于 %d \n",i,j); else if(i EQ j) printf("%d 等于 %d \n",i,j); else if(i SMA j) printf("%d 小于 %d \n",i,j); else printf("没有值。\n"); return 0; }
以上实例输出结果为:
10 小于 20
程序分析:0&0=0; 0&1=0; 1&0=0; 1&1=1 。
程序源代码:
#include <stdio.h>
int main()
{
int a,b;
a=077;
b=a&3;
printf("a & b(decimal) 为 %d \n",b);
b&=7;
printf("a & b(decimal) 为 %d \n",b);
return 0;
}
以上实例输出结果为:
a & b(decimal) 为 3
a & b(decimal) 为 3
程序分析:0|0=0; 0|1=1; 1|0=1; 1|1=1 。
程序源代码:
#include<stdio.h>
int main()
{
int a,b;
a=077;
b=a|3;
printf("b 的值为 %d \n",b);
b|=7;
printf("b 的值为 %d \n",b);
return 0;
}
以上实例输出结果为:
b 的值为 63
b 的值为 63
程序分析:0^0=0; 0^1=1; 1^0=1; 1^1=0 。
程序源代码:
#include <stdio.h>
int main()
{
int a,b;
a=077;
b=a^3;
printf("b 的值为 %d \n",b);
b^=7;
printf("b 的值为 %d \n",b);
return 0;
}
以上实例输出结果为:
b 的值为 60
b 的值为 59
程序分析:可以这样考虑:
(1)先使 a 右移 4 位。
(2)设置一个低 4 位全为 1,其余全为 0 的数,可用(0<<4)
(3)将上面二者进行 & 运算。
#include <stdio.h>
int main()
{
unsigned a,b,c,d;
printf("请输入整数:\n");
scanf("%o",&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf("%o\n%o\n",a,d);
return 0;
}
以上实例输出结果为:
请输入整数:
36
36
1
程序分析:~0=-1; ~1=-2;
程序源代码:
#include <stdio.h>
int main()
{
int a,b;
a=234;
b=~a;
printf("a 的按位取反值为(十进制) %d \n",b);
a=~a;
printf("a 的按位取反值为(十六进制) %x \n",a);
return 0;
}
以上实例输出结果为:
请输入整数:
a 的按位取反值为(十进制) -235
a 的按位取反值为(十六进制) ffffff15
程序分析:无。
#include <graphics.h> //VC6.0中是不能运行的,要在Turbo2.0/3.0中 int main() { int driver,mode,i; float j=1,k=1; driver=VGA; mode=VGAHI; initgraph(&driver,&mode,""); setbkcolor(YELLOW); for(i=0;i<=25;i++) { setcolor(8); circle(310,250,k); k=k+j; j=j+0.3; } return 0; }
程序分析:无。
程序源代码:
#include "graphics.h" int main() { int driver,mode,i; float x0,y0,y1,x1; float j=12,k; driver=VGA;mode=VGAHI; initgraph(&driver,&mode,""); setbkcolor(GREEN); x0=263;y0=263;y1=275;x1=275; for(i=0;i<=18;i++) { setcolor(5); line(x0,y0,x0,y1); x0=x0-5; y0=y0-5; x1=x1+5; y1=y1+5; j=j+10; } }
#include<stdio.h>
int main()
{
int a,b;
a=077;
b=a|3;
printf(“b 的值为 %d \n”,b);
b|=7;
printf(“b 的值为 %d \n”,b);
return 0;
}
以上实例输出结果为:
b 的值为 63
b 的值为 63
**题目53:**学习使用按位异或 ^。 **程序分析:**0^0=0; 0^1=1; 1^0=1; 1^1=0 。 程序源代码: ```c #include <stdio.h> int main() { int a,b; a=077; b=a^3; printf("b 的值为 %d \n",b); b^=7; printf("b 的值为 %d \n",b); return 0; }
以上实例输出结果为:
b 的值为 60
b 的值为 59
程序分析:可以这样考虑:
(1)先使 a 右移 4 位。
(2)设置一个低 4 位全为 1,其余全为 0 的数,可用(0<<4)
(3)将上面二者进行 & 运算。
#include <stdio.h>
int main()
{
unsigned a,b,c,d;
printf("请输入整数:\n");
scanf("%o",&a);
b=a>>4;
c=~(~0<<4);
d=b&c;
printf("%o\n%o\n",a,d);
return 0;
}
以上实例输出结果为:
请输入整数:
36
36
1
程序分析:~0=-1; ~1=-2;
程序源代码:
#include <stdio.h>
int main()
{
int a,b;
a=234;
b=~a;
printf("a 的按位取反值为(十进制) %d \n",b);
a=~a;
printf("a 的按位取反值为(十六进制) %x \n",a);
return 0;
}
以上实例输出结果为:
请输入整数:
a 的按位取反值为(十进制) -235
a 的按位取反值为(十六进制) ffffff15
程序分析:无。
#include <graphics.h> //VC6.0中是不能运行的,要在Turbo2.0/3.0中 int main() { int driver,mode,i; float j=1,k=1; driver=VGA; mode=VGAHI; initgraph(&driver,&mode,""); setbkcolor(YELLOW); for(i=0;i<=25;i++) { setcolor(8); circle(310,250,k); k=k+j; j=j+0.3; } return 0; }
程序分析:无。
程序源代码:
#include "graphics.h" int main() { int driver,mode,i; float x0,y0,y1,x1; float j=12,k; driver=VGA;mode=VGAHI; initgraph(&driver,&mode,""); setbkcolor(GREEN); x0=263;y0=263;y1=275;x1=275; for(i=0;i<=18;i++) { setcolor(5); line(x0,y0,x0,y1); x0=x0-5; y0=y0-5; x1=x1+5; y1=y1+5; j=j+10; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。