7-1 sdut-C语言实验-A+B for Input-Output Practice (Ⅳ)
Your task is to Calculate a + b.
输入格式:
Your task is to Calculate a + b.
输出格式:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.
输入样例:
在这里给出一组输入。例如:
2
1 5
10 20
输出样例:
在这里给出相应的输出。例如:
6
30
#include<stdio.h>
int main()
{
int a,b,n,i;//定义计数器i,计算次数n,加数a,b
scanf("%d",&n);
for( i = 0; i < n; i ++) //循环n次
{
scanf("%d %d",&a,&b);
printf("%d\n",a+b);//不要忘记换行符号⭐
}
return 0;
}
7-2 sdut-C语言实验—两个数比较
求2个数中较大者。
输入格式:
第一行为测试的数据组数N,接下来的N行分别是两个待比较的整数。
输出格式:
输出N行,每一行的值为每组数中较大的整数。
输入样例:
2
1 2
15 10
输出样例:
在这里给出相应的输出。例如:
2
15
#include<stdio.h>
int main()
{
int N,i,a,b;//定义输入组数N,计数器i,待比较整数a,b
scanf("%d",&N);
for( i = 0; i < N; i ++)
{
scanf("%d %d",&a,&b);
if(a >= b)
{//养成好习惯,要写大括号
printf("%d\n",a);//刚才格式错误→又是忘了换行❤
}
else
printf("%d\n",b);
}
return 0;
}
7-3 sdut- C语言实验-计算1到n的和(循环结构)
从键盘上输入任意一个整数n,计算1到n的和。
输入格式:
从键盘输入任意整数n。
输出格式:
输出1到n的和。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
6
#include<stdio.h>
int main()
{
int n,i;//定义计数器i,循环次数n
int sum = 0;//一定要定义sum的初始值啊啊啊啊啊啊啊啊啊😫
scanf("%d",&n);
for( i = 1; i <= n; i ++)//从1加到n,i从1开始,注意n取等号
{
sum += i;//自增运算符 等价于 sum = sum + i;
}
printf("%d",sum);
return 0;//耶耶
}
7-4 sdut-C语言实验-求阶乘(循环结构)
从键盘输入任意一个大于等于0的整数n,然后计算n的阶乘,并把它输出。
提示: 0!是 1 。
输入格式:
输入任意一个大于等于0的整数n。
输出格式:
输出n!
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
6
#include<stdio.h>
int main()
{
int n,i;
int mul = 1;//这里乘积mul要定义为1,0*任何数=0,0!=1
scanf("%d",&n);
for( i = 1; i <= n; i ++)
{//不满足条件时,n==0,此时n<i,不符合循环条件,直接输出1
mul *= i;//自乘运算符
}
printf("%d",mul);
return 0;😘
}
7-5 sdut-C语言实验- 做乘法
请用C语言编写一个程序。此程序接收一个正整数N,然后打印输出“N次N*(1->N)格式”的数据。例如:此程序接收正整数5,那会输出以下格式的数据:
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
输入格式:
只有一个正整数N(N<=100)。
输出格式:
输出共N行数据,如上面的例子所示。
输入样例:
在这里给出一组输入。例如:
5
输出样例:
在这里给出相应的输出。例如:
5*1=5
5*2=10
5*3=15
5*4=20
5*5=25
#include<stdio.h>
int main()
{
int N,i;
scanf("%d",&N);//不要忘记取地址😶
for( i = 1; i <= N; i ++)//依然是从1开始呐
{
printf("%d*%d=%d\n",N,i,N*i);
}//第一次提交又忘了换行符!!😢
return 0;
}
7-6 sdut-C语言实验-数列求和
数列求和是一类常见的问题,本题有一定的代表性:
求s=a+aa+aaa+aaaa+……+aa…aa(n位)
其中,a的值由键盘输入,位数n也由键盘输入。
输入格式:
第一行输入a的值;
第二行输入位数n。
输出格式:
输出对n个数完成求和运算后的结果。
比如a=3,n=6时,s=3+33+333+3333+33333+333333
输入样例:
3
6
输出样例:
在这里给出相应的输出。例如:
370368
/*思路:
观察每一项都是可以拆开,拆成前面最大的位数+后面→
有一种迭代10倍关系,所以可以利用累加:a = a + c,类似形式
最后再找一个加和sum存起所有的项*/
#include<stdio.h>
int main()
{
int n,i;//定义一共加和的次数&位数
int temp = 0;//保存每个项
int item;//每位的数字
int sum = 0;//定义累加器😴一定要初始化为0
scanf("%d \n %d",&item,&n);
for( i = 0; i< n; i ++)
{//下面三步运算过程一定要在草稿纸上写,非常关键⭐⭐⭐→体现思考过程
temp = temp + item;//temp表示每一项,如33 333 3333
sum += temp;//预先加
item = item*10;
/*拆成两项相加:30+3/300+33/3000+333/后数是上一步
的temp,前数是上一步的item*10,从而都累加到sum里😙*/
}
printf("%d",sum);
return 0;
}
7-7 求Fibonacci(斐波那契)数列的n项和
已知斐波那契数列有如下特点:第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13,……。本题要求编写程序,计算该数列的前n项和。
输入格式:
键盘输入n(2≤n≤40)。
输出格式:
sum=S,S为斐波那契数列的前n项和。
输入样例:
10
输出样例:
sum=143
题解1:常规实现
#include<stdio.h>
/*考虑到斐波那契数列的特殊性,同样要用一个变量temp把
每一次的前两项存起来,再累加到sum里,在这个过程中
更要注意i的取值问题*/
int main()
{
int n,i,num1,num2;
num1 = 1;
num2 = 1;
int item = 0;
int sum = 0;//不要忘记初始化
item = num1 + num2;//⭐
scanf("%d",&n);
//1、1、2、3、5、8、13
//这里怎么去找这个规律呢
/* num1 num2 item
1 1 2
1 2 3
3 5
8
sum累加的是item其他的是中间变量,找到num
和item的关系*/
//显而易见:num2 = item(上一次的)
for( i = 1; i < n; i ++)
{//✌值得注意这里加了n-1次,而不是n次,所以i从1开始到n
sum += item;//item是第一次的和,所以在前面⭐要有初值
item = num1 + num2;
num1 = num2;
num2 = item;
}
printf("sum=%d",sum);//注意这里的格式,养成审题好习惯
return 0;
}
题解2:数组实现
#include<stdio.h>
int main()
{
int n,i;
int sum = 2;//递推形式加不到前两项,前两项和为2⭐
int arr[40]={1,1};//只定义数组前两个变量
scanf("%d",&n);
for( i = 2; i < n; i ++)
{
arr[i] = arr[i-1] + arr[i-2];//满足斐波那契递推形式
sum += arr[i];//利用计数器,每次加和arr[2]+arr[3]+arr[4]……
}
printf("sum=%d",sum);//注意打印格式😶
return 0;
}
7-8 sdut-C语言实验- 简单计算
接受从键盘输入的N个整数,输出其中的最大值、最小值和平均值(平均值为整除的商)。
输入格式:
第一行一个正整数N(N<=100);
第二行有N个用空格隔开的整数Ti (1 <= i <= N, 0 <= Ti <= 10000000)
输出格式:
三个有空格隔开的整数分别为最大值、最小值和平均值,其中平均值为整除的商。
输入样例:
在这里给出一组输入。例如:
5
1 2 3 5 4
输出样例:
在这里给出相应的输出。例如:
5 1 3
#include<stdio.h>
int main()
{
int N,i,a,maxn,minn,aver;
/*通过赋值法分别以数字去比较变量,从而赋值
通过分支语句判断满足条件进行赋值,易得要将
maxn初始化小而minn初始化大一点😊⭐*/
maxn = 0;
minn = 10000000;
int sum = 0;//用于计算平均值😢
scanf("%d",&N);
for( i = 0; i < N; i ++)
{
scanf("%d",&a);
if(a < minn)
minn = a;
if(a > maxn)//两个分支同时进行,不能用else⚠
maxn = a;
sum += a;
}
aver = sum / N;//注意输出格式是整形✌
printf("%d %d %d",maxn,minn,aver);
return 0;
}
7-9 sdut- C语言实验-判断素数(循环结构)
从键盘上输入任意一个正整数,然后判断该数是否为素数。
如果是素数则输出"This is a prime."
否则输出“This is not a prime.”
输入格式:
输入任意一个正整数n(1 <= n <= 1000000)。
输出格式:
判断n是否为素数,并输出判断结果:
如果n是素数则输出"This is a prime."
否则输出“This is not a prime.”
特别提醒:请注意对1的判定,1不是素数。
输入样例:
3
输出样例:
在这里给出相应的输出。例如:
This is a prime.
#include<stdio.h>
int main()
{
int n,i;
scanf("%d",&n);
if(n == 1)//注意1的特判⭐1不是素数
{
printf("This is not a prime.");
return 0;
}//用return 0提前结束程序时别忘记加{}
for( i = 2; i < n; i ++)
{
if(n%i == 0)
break;
}
if(i >= n)//利用i的大小进行判断⭐
printf("This is a prime.");
else
printf("This is not a prime.");
return 0;
}
7-10 sdut-C语言实验- 求绝对值最大值
求n个整数中的绝对值最大的数。
输入格式:
输入数据有2行,第一行为n,第二行是n个整数。
输出格式:
输出n个整数中绝对值最大的数。
输入样例:
在这里给出一组输入。例如:
5
-1 2 3 4 -5
输出样例:
在这里给出相应的输出。例如:
-5
#include<stdio.h>
int main()
{
int n,i,num,item,temp;//待比较数字个数n,计数器i
scanf("%d",&n);//待比较数字num,中间变量item,输出样例temp
int max = 0;//赋值变量max
for( i = 0 ; i < n ; i ++ )
{
scanf("%d",&num);
if(num < 0)
item = -num;//item表示绝对值,方便进行比较⭐
else
item = num; //统一把数字赋给item进行比较
if( item >= max )
{
max = item;
temp = num;//代码段都要在for循环之内
}//temp只作为输出样例
}
printf("%d",temp);
return 0;
}
7-11 sdut- C语言实验—分数序列
有一个分数序列:2/1, 3/2, 5/3, 8/5, 13/8, …编写程序求出这个序列的前n项之和。
输入格式:
输入只有一个正整数n,1≤n≤10。
输出格式:
请在这里描述输出格式。例如:对每一组输入,在一行中输出A+B的值。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
5.166667
#include<stdio.h>
int main()
{
int n,i;
double item,temp,num1,num2;//输出结果得是小数
double sum = 0;//此处的item作为中间变量储存数值使用
scanf("%d",&n);
num1 = 1.0;
num2 = 2.0;
for( i = 0 ; i < n ; i ++)
{
temp = num2/num1;
sum = sum + temp;
item = num2;//用item存起来
num2 = num1 + num2;//类似于斐波那契数列的性质
num1 = item;
}
printf("%lf",sum);
return 0;//😢
}
7-12 sdut-C语言实验- 平方数
飞飞特别喜欢平方数,可是他数学并不好,你能帮他计算 n 与 m 之间所有平方数之和吗?
提示:若一个整数的开方还是整数,它就是平方数。例如:4、9、16、25是平方数。n 和 m 均可能为 0 至 100000000 内的任意整数,n、m不一定有序。
输入格式:
第一行 T 代表数据的组数。
接下来有 T 行,每行两个整数n,m (0 <= n, m <= 100000000)
输出格式:
输出一个整数,代表所求区间内平方数之和。
输入样例:
3
1 4
10 3
17 20
输出样例:
在这里给出相应的输出。例如:
5
13
0
#include<stdio.h>
#include<math.h>
/*类似的嵌套循环的题目有很多,保证外层
和内层的作用,大部分题目需要外层枚举然
后内层循环判定*/
int main()
{
int a,b,n,i,j;
scanf("%d",&n);
for( i = 0 ; i < n ; i ++)
{//如何保证ab不一定有序→比较赋值⭐
int sum = 0;//这个sum要在循环内定义
scanf("%d %d",&a,&b);
if(a>b)
{
int item = a;
a = b;
b = item;//把b赋成大的
}
for( j = a ; j <= b ; j ++)
{
int item = pow(j,0.5);//pow函数,也可以用sqrt
if(item * item == j)//平方数成立条件
sum += j;
}
printf("%d\n",sum);
}
return 0;
}
7-13 sdut - C语言实验—圆周率
输入n值,并利用下列格里高里公式计算并输出圆周率:
输入格式:
输入公式中的n值。
输出格式:
输出圆周率,保留5位小数。
输入样例:
在这里给出一组输入。例如:
1
输出样例:
在这里给出相应的输出。例如:
2.66667
题解1:暴力解构
#include<stdio.h>
int main()
{
int n,i;
double a,b,item;//item作为每一项的一个差
double pai = 0;//pai的值,别忘记最后要*4
scanf("%d",&n);
for( i = 1 ; i <= n ; i ++)//从1开始,否则结果是0
{
a = 1.0 / (4 * i - 3);//⭐这里一定要加(),注意优先运算级
b = 1.0 / (4 * i - 1);//⭐⭐因为结果要是小数,所以被除数要是1.0的小数形式
item = a - b;//否则结果输出整数
pai += item;
}
printf("%.5lf",4*pai);
return 0;
}
题解2:计数器妙用
#include<stdio.h>
int main()
{
int n,i;
int flag = 1;//作为标志进行正负的交替
double pai = 0;//从第二项开始
scanf("%d",&n);
for( i = 1 ; i <= 4*n-1 ; i = i + 2)
{
pai = pai + flag * 1.0 / i;//也要*1.0
flag = -flag;//正负1交替
}
printf("%.5lf",4*pai);
return 0;
}
7-14 sdut-C语言实验-虎子的虎年理财计划
传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。国王觉得很容易就可以满足他的要求,于是就同意了。但很快国王就发现,即使将国库所有的粮食都给他,也不够百分之一。
虎子深受启发,他开始了自己伟大的理财梦想:如果按照上面的复利计算,从这个虎年开始,第一年存1元钱,第二年存2元钱,第三年存4元钱,以此类推。你帮他算算,如果存n年(1<=n<=18),到下一个虎年虎子会存多少钱?
输入格式:
输入一个n,表示存n年。
输出格式:
输出虎子n年后的存款数额。
输入样例:
12
输出样例:
在这里给出相应的输出。例如:
4095
数组实现:
#include<stdio.h>
int main()
{
int n,i;
int sum = 1;//计数器得从1开始,所以sum的初值为arr[0]
int arr[18];
arr[0] = 1;//定义arr[0]的值,后续的通过递推求得
scanf("%d",&n);
for( i = 1 ; i < n ; i ++)
{
arr[i] = 2 * arr[i-1];//后面的项为前一项的两倍
sum = sum + arr[i];//用sum累计
}
printf("%d",sum);
return 0;
}
7-15 sdut-C语言实验-完美的素数
素数又称质数。指一个大于1的自然数,除了1和此整数自身外,不能被其他自然数整除的数。我们定义:如果一个素数是完美的素数,当且仅当它的每一位数字之和也是一个素数。现在给你一个正整数,你需要写个程序判断一下这个数按照上面的定义是不是一个完美的素数。
输入格式:
输入包含多组测试数据。
每组测试数据只包含一个正整数 n (1 < n <= 10^6)。
输出格式:
对于每组测试数据,如果 n 是完美的素数,输出“YES”,否则输出“NO”(输出均不含引号)。
输入样例:
在这里给出一组输入。例如:
11
13
输出样例:
在这里给出相应的输出。例如:
YES
NO
#include<stdio.h>
int main()
{
int n,i,j;
int cnt = 1;//用计数器做flag
int sum = 0;//得到各位的加和,方便后续判断
while(scanf("%d",&n) != EOF)
{
int b = n;//为了不改变n的值
while(b)//当b>0时
{
sum = sum + b%10;//得到加和
b = b/10;//各位相加
}
for( i = 2 ; i < n ; i ++)
{//判断是否为素数
if( n % i == 0 )
cnt ++;//不是的话cnt自增1
}
for( i = 2 ; i < sum ; i ++)//⭐注意截至的条件
{//判断是否和为素数
if( sum % i == 0 )
cnt ++;//同理
}
if(cnt == 1)//计数器做标志位
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
7-16 sdut-C语言实验-余弦
输入n的值,计算cos(x)。
输入格式:
输入数据有多行,每行两个数,包括x和n。第一数据为x,第二个数据为n。
输出格式:
输出cos(x)的值,保留4位小数。
输入样例:
在这里给出一组输入。例如:
0.0 100
1.5 3
输出样例:
在这里给出相应的输出。例如:
1.0000
0.0701
#include<stdio.h>
int main()
{
int n, i;
double x, item, temp, sum;
while(scanf("%lf %d",&x,&n) == 2)//double的输入格式一定是lf
{//输入两个值时为真⭐⭐
sum = 0;
item = 1.0;//被除数要是小数形式,结果才能得到小数
temp = x*x;
for( i = 1 ; i <= n ; i ++)
{//后续用到i,要从1开始,右边取等号
item *= -temp;//每次变化正负交替
item /= (i*2-1)*(i*2);//加括号→注意
sum += item;
}
/*注意for里的三行代码,其实这里的阶乘
已经被每一项循环拆开,item已经包含上一次的
(n-2)!,所以只需要多乘(n-1)乘n */
printf("%.4lf\n",sum);
}//别忘记加换行符号
return 0;
}
7-17 sdut-C语言实验-求某个范围内的所有素数
求小于n的所有素数,按照每行10个显示出来。
输入格式:
输入整数n(n<10000)。
输出格式:
每行10个依次输出n以内(不包括n)的所有素数。如果一行有10个素数,每个素数后面都有一个空格,包括每行最后一个素数。
输入样例:
100
输出样例:
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
/*依旧是先暴力枚举出范围内所有的数字然后
再嵌套内层循环从而筛选素数,注意要额外
增加换行*/
#include<stdio.h>
int main() {
int n,i,j;
int cnt = 0;//用于计数换行,别忘记初始化
scanf("%d",&n);
for( i = 2 ; i < n ; i ++)
{//⭐一定是嵌套循环,外层用i列举数字,内层用j判定素数
for( j = 2 ; j <= i ; j ++ )
if( i % j == 0)
{
break;//break跳出当前循环
}
if( j >= i) //判断是素数
{
printf("%d ",i);//要有空格😶
cnt++;
if(cnt % 10 == 0)//满十个换行,计数器的用处
printf("\n");
}//后两行代码应该在if语句的内部,否则cnt++后会多余打印换行
}
return 0;
}
7-18 水仙花数
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
/*由于pow函数计算缓慢,计算七位的水仙花数在
题目里会超时,所以题解预先在编译器得到七位水仙花数
而后直接踩点判定打印*/
#include<stdio.h>
#include<math.h>
/*同样视为嵌套循环,外层枚举,内层判定*/
int main()
{
int n,i,j;
scanf("%d",&n);
int a = pow(10,n);
int b = pow(10,n-1);//表示位数,用来卡i的值
if(n == 7) {
printf("1741725\n");
printf("4210818\n");
printf("9800817\n");
printf("9926315\n");
return 0;//由编译器先得出7位水仙花数,而后return 0;正常中止程序⭐
}
for( i = b ; i < a ; i ++)
{
int sum = 0;//每一次循环都要用一次sum,要定义在内部
int k = i;//后续要判定i的值,故带换一下
while(k)//此处也可以使用for
{
sum += pow(k%10,n);//累加各位数字的三次方
k /= 10;
}
if(sum == i)//判定,耶耶
printf("%d\n",i);
}
return 0;
}
7-19 计算阶乘和
对于给定的正整数N,需要你计算 S=1!+2!+3!+...+N!。
输入格式:
输入在一行中给出一个不超过10的正整数N。
输出格式:
在一行中输出S的值。
输入样例:
3
输出样例:
9
#include<stdio.h>
int main()
{
int n,i;
int sum = 0;
int arr[20];//数组可以开大,但不能开小,否则会数组越界
arr[0] = 1;//第一数组第一个值,由递推关系推后续的值😘
scanf("%d",&n);
for( i = 1 ; i <= n ; i ++)
{//从1开始,用sum累加
arr[i] = arr[i-1]*i;
sum += arr[i];
}
printf("%d\n",sum);
return 0;
}
7-20 输出整数各位数字
本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。
输入格式:
输入在一行中给出一个长整型范围内的非负整数。
输出格式:
从高位开始逐位输出该整数的各位数字,每个数字后面有一个空格。
输入样例:
123456
输出样例:
1 2 3 4 5 6
#include<stdio.h>
int main() {
int i,j;
int cnt = 0;
int num[20];//数字开大一点
long n;//用long定义后,别忘记输入格式也要转换成ld
scanf("%ld",&n);
if(n <= 9)//特判个位数
printf("%d ",n);//⭐注意这里后面也要有空格,坑我两次了,服了,查了半个小时
else {
for( i = 0 ; n / 10 > 0 ; i ++)
{/*注意区分此处n > 0的条件与n / 10 > 0的条件,两者含义不同
后者表示只有各位时终止循环,并且在for内需要多加一条if语句
如果此处填n > 0则计数器会多计一位,需要在后一个for内的设i = cnt - 1;*/
num[i] = n % 10;
n /= 10;
cnt ++;
if( n / 10 == 0)//如果只剩个位后
num[i+1] = n % 10;//赋给下一个数组
}
for( i = cnt ; i >= 0 ; i --)//数组逆序输出❤
printf("%d ",num[i]);
}
return 0;
}