沈阳航空航天大学 <循环结构课题>
目录
- 判断闰年
- 完数判断程序
- 计算两个日期所差的天数
- 判断回文数据
- 求最大公约数gcd和最小公倍数lcm
- 求多项式 1+2+3+…+n 的前n项之和
- 某序列求和
- 求n位数中的后n-1位
1.判断闰年
【问题描述】写一程序,从键盘上输入年份year(大于400),判断其是否闰年。闰年的条件是:能被4整除、但不能被100整除,或者能被400整除。
【输入形式】输入一个大于400的正整数,以回车结束。
【输出形式】输出判断结果。
【样例输入】2000
【样例输出】2000 is
【样例输入】2015
【样例输出】2015 not
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int year;
scanf("%d", &year);
if (year > 400)
{
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
{
printf("%d is", year);
}
else
{
printf("%d not", year);
}
}
else
printf("请输入大于400的年份");
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
2.完数判断程序
【问题描述】一个数如果恰好等于它的真因子之和,这个数就称为"完数"。例如,6的真因子有1、2、3,而6=1+2+3,因此6是"完数"。从键盘输入一个正整数m,判断其是否是完数,并按下面格式输出判断结果:
1、m是完数:6=1+2+3
2、m不是完数,真因子之和小于m:4>1+2
2、m不是完数,真因子之和大于m:12<1+2+3+4+6
【输入形式】输入正整数m。
【输出形式】判断m是否为完数并输出可能的结果。
【样例输入】6
【样例输出】6=1+2+3
【样例输入】4
【样例输出】4>1+2
【样例输入】12
【样例输出】12<1+2+3+4+6
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n, i, sum = 0;
scanf("%d", &n);
for (i = 1; i < n; i++)
{
if (n % i == 0)
sum += i;
}
if (n == sum)
{
printf("%d=1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d",i);
}
}
else if (n > sum)
{
printf("%d>1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d", i);
}
}
else if(n<sum)
{
printf("%d<1", n);
for (i = 2; i < n; i++)
{
if (n % i == 0)
printf("+%d", i);
}
}
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
3.计算两个日期所差的天数
【问题描述】输入两个完整日期,包括年月日,编程实现求两者之间所差的天数。
【输入形式】
第1个日期的年份|第1个日期的月份|第1个日期的具体哪一天
第2个日期的年份|第2个日期的月份|第2个日期的具体哪一天
【输出形式】1个整数(两个日期的天数差)
【样例输入】
2000 1 1
2001 1 1
【样例输出】366
【样例说明】输入非法日期的情况不予考虑,比如2025年2月29日
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int days(int year1, int month1, int day1, int year2, int month2, int day2);
int past(int year, int month, int day);
int year1,month1,day1;//起始日期的年月日
int year2,month2,day2;//目标日期的年月日
int t;
scanf("%d%d%d", &year1, &month1, &day1);
scanf("%d%d%d", &year2, &month2, &day2);
days(year1, month1, day1, year2, month2, day2);
return 0;
}
int past(int year, int month, int day)//用来计算没有过完的年已经过去的天数
{
int sum = day, p;
int month_1[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
//通过定义数组来储存各个月份有多少天
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
month_1[1] += 1;
//如果检测到闰年,2月对应的数组元素值+1
for (p = 0; p + 1 < month; p++)
{
sum = sum + month_1[p];
}
return sum;
//计算天数
}
int days(int year1, int month1, int day1, int year2,int month2,int day2)//负责计算天数
{
int sum = 0;
int m = 0, n = 0, a;
if (year1 == year2)//当起始日期和终止日期同年
{
sum = past(year2, month2, day2) - past(year1, month1, day1);
}
if (year1 + 1 == year2)//当起始日期和终止日期相差1年
{
if (year1 % 400 == 0 || year1 % 4 == 0 && year1 % 100 != 0)
{
sum = 366 + past(year2, month2, day2) - past(year1, month1, day1);
}
else
{
sum = 365 + past(year2, month2, day2) - past(year1, month1, day1);
}
}
if (year2 > year1 + 1)//相差1年以上
{
for (a = year1 + 1; a < year2; a++)
//计算除去起始日期和目标日期那两年,它们之间总共有多少个闰年,当检测到闰年时,计数器n就+1
{
if (a % 400 == 0 || a % 4 == 0 && a % 100 != 0)
{
n++;
}
}
if (year1 % 400 == 0 || year1 % 4 == 0 && year1 % 100 != 0)//计算起始日期和目标日期总共隔了多少天
{
sum = (year2 - year1 - 1) * 365 + n + 366 + past(year2, month2, day2) - past(year1, month1, day1);
}
else
{
sum = (year2 - year1 - 1) * 365 + n + 365 + past(year2, month2, day2) - past(year1, month1, day1);
}
}
printf("%d", sum);
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
4.判断回文数据
【问题描述】从从键盘任意输入一个正整数,编程判断该数是否是回文数。所谓回文数就是从左到右读这个数和从右到左读一样,如12321。
【输入形式】正整数,以回车结束。
【输出形式】是或不是回文数的判断结果。
【样例输入】12321
【样例输出】12321 is palindromic number
【样例输入】1231
【样例输出】1231 is not palindromic number
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a, b, sum = 0;
scanf("%d", &a);
b = a;
while (b != 0) {
sum = sum * 10 + b % 10;
b = b / 10;
}
if (sum == a && a > 0) //新数和原数相等并且原数不为负数的时候才为回文
{
printf("%d is palindromic number\n", a);
}
else
{
printf("%d is not palindromic number\n", a);
}
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
5.求最大公约数gcd和最小公倍数lcm
【问题描述】输入两个正整数m和n,求其最大公约数gcd和最小公倍数lcm。
【输入形式】输入两个正整数m和n。
【输出形式】输出m和n的最大公约数和最小公倍数,空格分隔。
【样例输入】2 6
【样例输出】2 6
【样例输入】3 5
【样例输出】1 15
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int m, n, gcd, lcm;
scanf("%d %d", &m, &n);
lcm = m * n;
gcd = m % n;
while (gcd != 0)
{
m = n;
n = gcd;
gcd = m % n;
}
gcd = n;
lcm /= gcd;
printf("%d %d", gcd, lcm);
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
6.求多项式 1+2+3+…+n 的前n项之和
【问题描述】求多项式 1+2+3+…+n 的前n项之和。n值由键盘输入(n不大于100)。
【输入形式】1个整数
【输出形式】1个整数
【样例输入】3
【样例输出】6
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i, n, sum = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
sum += i;
printf("和是%d", sum);
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
7.某序列求和
【问题描述】从键盘输入正整数 n,编程实现序列 2/1,3/2,5/3,8/5,13/8,21/13 … 的前 n 项之和。
【输入形式】输入正整数 n。
【输出形式】输出求和结果,保留小数点后两位。
【样例输入】1
【样例输出】2.00
【样例输入】25
【样例输出】40.75
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,i;
double sum = 0,x = 2, y = 1, t;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum += x / y;
t = x; //把分子的值赋给t
x = y + x; //把x+y的值赋给分母x
y = t; //把t的值赋给分子
}
printf("%.2lf", sum);
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力
8.求n位数中的后n-1位
【问题描述】输入任意一个整数num,如果有n位,则输出其后n-1位整数;若是1位数,则输出0。
【输入形式】输入1个正整数,需用long类型表示。
【输出形式】输出其后n-1位整数
【样例输入】9
【样例输出】0
【样例输入】6734
【样例输出】734
【样例输入】1000
【样例输出】0
【样例输入】10101
【样例输出】101
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
long num, num_num, temp;//输入num,输出num_num
int i = 1;
scanf("%ld", &num);
temp = num;
if (num == 0 || num < 10)
printf("\0");
else {
do {
i *= 10;
num /= 10;
} while (num);
i = i / 10;
num_num = temp % i;
}
printf("%ld", num_num);
return 0;
}
//SAU-计科2304-NineSense
//仅供参考 学习还需自己努力