1.求一个sn=a+aa+aaa+aaaa+aaaaa之值,其中a和n的值由键盘输入
#include <stdio.h>
int main()
{
int i = 0, j = 0;
int n;
int a;
int sum = 0;
printf("请输入a和n的值:\n");
scanf_s("%d%d", &a,&n);
for (i = 1; i <= n; i++)
{
{//如果sum放在后面的话,假设a=2,那么sum里面的第一个值就是20,显然不符合题意,所以还是交换一下顺序比较好
sum = sum + a;//这里假设输入的a值为2的话,那么sum里面的第一个值就是2,这样就是对的
a += a * 10;//这里是a=a+a*10的简写形式,为什么要把这个东西放在sum后面呢?
}//原因很简单就是因为如果放在前面的话,那么第一个sum里面放的就是
}
printf("sum=%d", sum);
return 0;
}
2.展现出一个钻石
#include <stdio.h>
int main()
{
int i, j, k;
for (i = 0; i <= 3; i++)//这里注意了,如果把i=0改成了i=2,那么就会输出一个钻石形状的东西哦
{//注意了这里i<=3是因为要输出前四行,所以用了i<=3这个东西
for (j = 0; j <= 2 - i; j++)//当i=2时,只会循环一次,也就是打印一个空格
{//当i=3时,j小于等于一个负数怎么可能成立,所以判定为假,到此,这个循环结束,也就是说不再打印空格
printf(" ");
}
for (k = 0; k <= 2 * i; k++)//至于这里为什么是k<=2*1呢,这个要自己分析才能看出来
{//比如i=0时,只有一个*号;i=1时,有3个*号;i=2时,有5个*号;又因为k时从零开始算的
printf("*");//但其实写成k=1;k <=2*i+1;也行,就是不够简洁
}
printf("\n");
}
for (i = 0; i <= 2; i++)//这里为什么又是2呢,因为要输出后面的3行了
{//前面的四行空格是倒三角的结构,而后面的空格是正三角结构,所以是j<=i了;
for (j = 0; j <= i; j++)
{
printf(" ");
}
for (k = 0; k <= 4 - 2 * i; k++)//关于这里为什么是k<=4-2*i呢?
{
printf("*");//自己可以找规律啊,反正是可以自己总结出这个公式的
}
printf("\n");//注意这个换行符是在最外层的for循环里面的啊;
}
return 0;
}
3.求两个数的最大公约数(辗转相除法(欧几里得算法))
#include <stdio.h>
int main()
{
int m, n;
scanf_s("%d%d", &m, &n);
int r = m % n;//把m模n的值放进r里面
for (;r;)//这里就是一个简单的循环,其中就给了一个判断条件最中间的r如果等于0的话
{//那么循环就会停止,按照试除法的原理,那么最后的除数也就是源代码中的n就是我们要找的最大公约数了;
m = n;//欧几里得算法原理:用除数去除以两个数相除所得的余数,一直进行下去,直到余数为0就行;
n = r;
}
printf("%d", n);//所以这里打印的是n的值
return 0;
}
4.使用冒泡排序对10个数进行排序(升序)
#include <stdio.h>
int main()
{
int arr[10] = {0};//这个里面的0不要也没关系;
int i,j ;//这里在声明一点,for循环小括号里面的只是一个外部结构,你用任何字母都可以
int t=0;//只有for循环大括号里面的才是所要做的事情;小括号里面的东西只是决定循环多少次而已
for (i = 0; i < 10; i++)
{
scanf_s("%d", &arr[i]);//关于这里取不取地址符,我不取他不让我运行,我取了就可以,那应该是这里的arr表示的不是一个地址吧?
}
for (j= 0; j < 9; j++)//为什么是j<9呢,因为n个数要排序,只要进行(n-1)次外层循环就行了
{
int pause = 0;
for (i = 0; i < 9-j; i++)//这里为什么是(i<9-j)呢?
{//实在不理解假设j=0,如果此时(i<10-j)的话,那么i的最大值就是9,那么后面的i+1不就是10了么!
if (arr[i] <= arr[i + 1])//若是降序直接将大于等于改为小于等于就行
{//这里是交换顺序的一个操作
t = arr[i];//注意:当if后面的语句超过一行时,要加大括号,我之前没加大括号一直出错
arr[i] = arr[i + 1];//后面才看到,为了方便,建议还是加一个大括号(就算只有一条语句)
arr[i + 1] = t;//这样可以有效避免出错;
pause = 1;
}
}//第82行代码的续:则此时对应arr[10],但是arr里面总共才10个元素,最大应该是arr[9]啊,所以是(9-i)
if (pause == 0)//为什么放在这个位置?
{//请看下行!
break;
}
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);//前面的代码已经排序完成了,这里只要打印出来就行;
}
return 0;
}//我对第77行代码有一点小疑问
//如果将上面所有有关pause的全部代码删掉,那么就也会成功,但是这样会很麻烦,因为要比较的次数变多了!
//如果将上面的pause保留下来,就是一个很好的提前终止程序运行的代码!
//注意哦!上面的代码最后面的pause语句是放在第一个for循环语句里面的,不能放在第二个里面哦,因为
//就算你放在了第二个里面也没有多大作用!因为第二个for循环里面有一个if语句,它自己内部排序好了之后
//自己会跳出本次循环,根本不要再里面加我的这个pause变量!
//至于为什么放在第二个for循环里面呢?因为当你已经全部排好了之后,再进去这个循环已经没什么用了
//最后,if语句的执行条件是pause==0;那么就不会执行这个break语句,刚好达到我所想要的目的!