目录
3 编程练习
1 整数分解
#include<stdio.h>
int main(){
int x;
int n;
int mask=1;
scanf("%d",&x);
n=x; //利用n替换x使其值不变在下一轮循环依然可以使用
while(n>9){ //用while循环判断是否需要进行操作而不是盲目操作 这一个的while循环的作用是找出mask的合适值
n/=10;
mask*=10;
}
int t;
do{t=x/mask; //利用反复的除法和取余得到从首位依次开始的数字并加上if来判断是否添加空格
printf("%d",t);
if(mask>9){
printf(" ");}
x=x%mask;
mask=mask/10;
}while(mask>0); //循环结束的条件用mask判断
printf("\n");
return 0;
2 求最大公约数
下面的代码是利用for循环枚举法进行筛选最大公约数,便于理解但效率不高
#include<stdio.h>
int main()
{int a,b;
int min;
scanf("%d %d",&a,&b);
if(a<b){
min=a;
}else{min=b;
}
int ret=0;
int i;
for(i=1;i<=min;i++){
if(a%i==0){if(b%i==0){ret=i;
}
}
}
printf("%d和%d的最大公约数是%d。\n",a,b,ret);
return 0;
}
我们也可以运用辗转相除法来进行最大公约数的求取
辗转相除法
1 如果b等于0,计算结束,a就是最大公约数;
2 否则,计算a除以b的余数,让a等于b,而b等于那个余数·;
3 回到第一步。
/* a b t
12 18 12
18 12 6
12 6 0
6 0 */
#include<stdio.h>
int main()
{
int a,b;
int t;
scanf("%d %d",&a,&b);
while(b!=0){
t=a;
a=b;
b=t%b;
}printf("最大公约数是%d。\n",a);
return 0;
}
辗转相除法可以有效的避免繁杂运算
编程练习
1 求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字。请输出所有由它们组成的无重复数字的3位数。
输入格式
满足输出条件的三位数,要求从小到大,每行六个整数,整数之间用空格分开,但行末不能有多余空格。
输入样例
2
输出样例
234 235 243 245 253 254
324 325 342 345 352 354
423 425 432 435 452 453
523 524 532 534 542 543
#include<stdio.h>
int main()
{int A;
printf("请输入一个不大于6的数字。");
scanf("%d",&A);
int i,j,k;//由于是三位数所以在此定义三个变量用于后续的循环计算和结果表示
int cnt=0;//此处的cnt是一个计数值,因为要求每六个结果一行那么就需要利用cnt计数,每输出一个结果cnt加1。
i=A;
while(i<=A+3){
j=A;
while(j<=A+3){
k=A;
while(k<=A+3){
if(i!=j){
if(i!=k){
if(j!=k){
cnt++;
printf("%d%d%d",i,j,k);//此处也可以用 printf("%d",i*100+j*10+k); 替换效果一样。
if(cnt==6){ //当cnt==6时要加一个回车。
printf("\n");
cnt=0; //每当cnt==6后需要重新赋值0以进入下一次运算。
}else{
printf(" "); //当cnt!6时要加一个空格。
}
}
}
}
k++;}
j++;}
i++;}
return 0;
}
这是一个利用while循环所做的源代码,其中一些关键点在行代码后有注释
下边是利用for循环做的代码
#include<stdio.h>
int main()
{int A;
printf("请输入一个不大于6的数字。");
scanf("%d",&A);
int i,j,k;//由于是三位数所以在此定义三个变量用于后续的循环计算和结果表示
int cnt=0;//此处的cnt是一个计数值,因为要求每六个结果一行那么就需要利用cnt计数,每输出一个结果cnt加1。
for(i=A;i<=A+3;i++){
for(j=A;j<=A+3;j++){
for(k=A;k<=A+3;k++){
if(i!=j){
if(i!=k){
if(j!=k){
cnt++;
printf("%d%d%d",i,j,k);//此处也可以用 printf("%d",i*100+j*10+k); 替换效果一样。
if(cnt==6){ //当cnt==6时要加一个回车。
printf("\n");
cnt=0; //每当cnt==6后需要重新赋值0以进入下一次运算。
}else{
printf(" "); //当cnt!6时要加一个空格。
}
}
}
}
}
}
}
return 0;
}
2 水仙花数
水仙花数是指一个N位正整数(N>=3),它的每个位数上的数字的N次幂之和等于它本身。
例如:153=1³+5³+3³。
输入格式:
输入在一行中给出一个正整数N(3<=N<=7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输出样例:
153
370
371
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int first=1;
int i=1;
while(i<n){
first*=10;
i++;
}
i=first;
int a,b;
while(i<first*10){
a=i;
int sum=0;
do{
b=a%10;
a/=10;
int c=0;
int x=1;
while(c<n){
x*=b;
c++;
}
sum+=x;
}while(a>0);
if(sum==i){
printf("%d\n",i);
}
i++; }
return 0;
}
for循环代码
#include<stdio.h>
int main()
{int n;
scanf("%d",&n);//输入的n代表n位数
int first=1;
int i;
for(i=1;i<n;i++){
first*=10;}//first从1开始乘n-1个10得到最小的n位数
int a,b;
int sum=0;
for(i=first;i<first*10;i++){//让i遍历所有的n位数
int sum=0;
int a=i;
int d;
for(d=0;d<n;d++){//从0到n得到n位数的每位数
b=a%10;//取余得个位数
a/=10;//舍去个位数
int x=1;
int c;
for(c=0;c<n;c++){//此处for循环得到每位数的n次方
x*=b;}
sum+=x;}//用sum+=x将每位数的n次方加起来所以应该放在上一个for循环外
if(sum==i){
printf("%d\n",i);}//此处为判断最终的sum值是否符合所以放的位置要再跳出一个for循环
sum=0;}
return 0;
}