1.输入某年某月某日,判断这一天是这一年的第几天?
c
//输入某年某月某日,判断这一天是这一年的第几天?
#include <stdio.h>
int isLeapYear(int year) {
// 闰年的判断规则:能被4整除且(不能被100整除或能被400整除)
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
return 1;
}
return 0;
}
int main() {
int year, month, day;
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int totalDays = 0;
printf("请输入年份、月份和日期(格式:年 月 日):");
scanf("%d %d %d", &year, &month, &day);
// 判断是否是闰年
if (isLeapYear(year)) {
daysInMonth[1] = 29; // 闰年2月有29天
}
// 计算从1月1日到输入日期的天数
for (int i = 0; i < month - 1; i++) {
totalDays += daysInMonth[i];
}
totalDays += day; // 加上当前月份的天数
printf("%d年%d月%d日是该年的第%d天\n", year, month, day, totalDays);
return 0;
}
2.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
c
#include <stdio.h>
#include <math.h>
int main()
{
int i,x,y;
for(i=0;i<=10000;i++)
{
x=(int)sqrt(i+100);//注意强制类型转换
y=(int)sqrt(i+168);
if((x*x==i+100)&&(y*y==i+168))//注意要加100,168
{
printf("%d是平方数",i);
break;
}
}
}
3.输入三个整数 x、y、z,请把这三个数由小到大输出。
c
#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);
}
4.输出 9*9 口诀
c
#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"); /* 每一行后换行 */
}
return 0;
}
5.古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
c
#include <stdio.h>
int main() {
// 定义变量存储每个月的兔子对数
unsigned long long int first = 1, second = 1, next;
// 输出第一个月和第二个月的兔子对数
printf("第1个月: %llu 对兔子\n", first);
printf("第2个月: %llu 对兔子\n", second);
// 计算并输出第3个月到第40个月的兔子对数
for (int month = 3; month <= 40; month++) {
next = first + second; // 当前月的兔子对数为前两个月之和
printf("第%d个月: %llu 对兔子\n", month, next);
// 更新下一个月的计算值
first = second;
second = next;
}
return 0;
}
6.判断 101 到 200 之间的素数
c
#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;
}
7.打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
c
#include <stdio.h>
int main() {
int i, x, y, z;
// 遍历 100 到 999 的数字
for (i = 100; i < 1000; i++) {
// 计算各位数字
x = i % 10; // 个位
y = (i / 10) % 10; // 十位
z = (i / 100) % 10; // 百位
// 计算立方和
int sum = x * x * x + y * y * y + z * z * z;
// 判断是否为水仙花数
if (i == sum) {
printf("%d\n", i);
}
}
return 0;
}
8.将一个正整数分解质因数。
c
#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;
}
9.利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
c
#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;
}
10.最大公约数和最小公倍数
(1)最小公倍数=输入的两个数之积除于它们的最大公约数,关键是求出最大公约数;
(2)求最大公约数用辗转相除法(又名欧几里德算法)
c
#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;
}
11.输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
c
#include <stdio.h>
int main() {
char c;
int letterCount = 0, spaceCount = 0, digitCount = 0, otherCount = 0;
printf("请输入一些字符:\n");
while ((c = getchar()) != '\n') {
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
letterCount++;
} else if (c >= '0' && c <= '9') {
digitCount++;
} else if (c == ' ') {
spaceCount++;
} else {
otherCount++;
}
}
printf("字母 = %d, 数字 = %d, 空格 = %d, 其他 = %d\n", letterCount, digitCount, spaceCount, otherCount);
return 0;
}
12.求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字,例如 2+22+222+2222+22222 (此时共有5个数相加),几个数相加有键盘控制。
c
#include <stdio.h>
#include <string.h>
int main() {
int a, n;
long long sum = 0; // 使用 long long 类型来存储较大的和
// 获取用户输入
printf("请输入数字 a: ");
scanf("%d", &a);
printf("请输入相加项的数量 n: ");
scanf("%d", &n);
// 初始化变量
long long currentNumber = 0;
// 循环生成并累加每个项
for (int i = 1; i <= n; i++) {
currentNumber = currentNumber * 10 + a; // 构造当前项
sum += currentNumber; // 累加到总和中
}
// 输出结果
printf("结果是: %lld\n", sum);
return 0;
}
13.一个数如果恰好等于它的因子之和,这个数就称为"完数",例如 6=1+2+3 ,请编程找出 1000 以内的所有完数。
c
#include <stdio.h>
int main() {
printf("1000以内的所有完数是:\n");
// 遍历从1到1000的每一个整数
for (int num = 1; num <= 1000; num++) {
int sum = 0;
// 计算num的所有因子(不包括自身)
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
sum += i;
}
}
// 判断因子之和是否等于原数
if (sum == num) {
// 打印完数及其因子
printf("%d: ", num);
for (int i = 1; i <= num / 2; i++) {
if (num % i == 0) {
printf("%d ", i);
}
}
printf("\n");
}
}
return 0;
}
14.一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
c
#include <stdio.h>
#define INITIAL_HEIGHT 100.0
#define BOUNCE_COUNT 10
int main()
{
double h = INITIAL_HEIGHT;
double s = INITIAL_HEIGHT;
// 第一次反弹高度
h /= 2;
// 计算后续反弹高度和总路程
for (int i = 2; i <= BOUNCE_COUNT; i++) {
s += 2 * h;
h /= 2;
}
// 输出结果,指定小数位数为2位
printf("第%d次落地时,共经过%.5f米,第%d次反弹高%.5f米\n", BOUNCE_COUNT, s, BOUNCE_COUNT, h);
return 0;
}
15.猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个
第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下
的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
c
//第10天早上:剩1个桃子。
//第9天早上:设第9天早上剩下的桃子数为 x,则第10天早上剩下的桃子数为 (x / 2) - 1 = 1。x=(1+1)×2=4
#include <stdio.h>
int main() {
int day = 10; // 第10天早上剩1个桃子
int peaches = 1; // 第10天早上剩下的桃子数
// 从第10天倒推到第1天
for (int i = day; i > 1; i--) {
peaches = (peaches + 1) * 2;
}
printf("第一天共摘了 %d 个桃子。\n", peaches);
return 0;
}
16.两个乒乓球队进行比赛,各出三人,甲队为 a、b、c 三人,乙队为 x、y、z 三人。
抽签决定比赛名单,有人向队员打听比赛的名单:a 说他不和 x 比,c 说他不和 x、z 比,请编写代码找出三队赛手的名单。
c
#include <stdio.h>
int main() {
char teamA[3] = {'a', 'b', 'c'};
char teamB[3] = {'x', 'y', 'z'};
// 穷举所有可能的比赛组合
for (int a_match = 0; a_match < 3; a_match++) {
for (int b_match = 0; b_match < 3; b_match++) {
for (int c_match = 0; c_match < 3; c_match++) {
// 检查是否有重复的比赛对手
if (a_match != b_match && b_match != c_match && a_match != c_match) {
// 检查条件是否满足
if (a_match != 0 && c_match != 0 && c_match != 2) { // a不和x比,c不和x、z比
printf("比赛名单:\n");
printf("a 对阵 %c\n", teamB[a_match]);
printf("b 对阵 %c\n", teamB[b_match]);
printf("c 对阵 %c\n", teamB[c_match]);
printf("\n");
}
}
}
}
}
return 0;
}
c
// *
// ***
// *****
//*******
// *****
// ***
// *
#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");
}
}
18.有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
c
#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);
}
19.求 1 + 2! + 3! + ... + 20! 的和。
c
#include <stdio.h>
// 计算阶乘的函数
unsigned long long factorial(int n) {
unsigned long long result = 1;
for(int i = 1; i <= n; i++) {
result *= i;
}
return result;
}
int main() {
unsigned long long sum = 0;
// 计算1 + 2! + 3! + ... + 20!
for(int i = 1; i <= 20; i++) {
sum += factorial(i);
}
// 输出结果
printf("1 + 2! + 3! + ... + 20!的和是: %llu\n", sum);
return 0;
}
20.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
c
#include <stdio.h>
// 递归函数声明
void print_reverse(char *chars, int index);
int main() {
char chars[6]; // 存储5个字符及结尾的空字符
// 输入5个字符
printf("请输入5个字符: ");
for (int i = 0; i < 5; i++) {
scanf(" %c", &chars[i]);
}
chars[5] = '\0'; // 确保字符串以空字符结尾
// 调用递归函数
print_reverse(chars, 0);
return 0;
}
// 递归函数定义
void print_reverse(char *chars, int index) {
// 递归终止条件:到达字符串末尾
if (chars[index] == '\0') {
return;
}
// 递归调用处理下一个字符
print_reverse(chars, index + 1);
// 在递归返回时打印当前字符
if (index < 5) { // 确保只打印实际输入的字符
printf("%c", chars[index]);
}
}
21.有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
c
#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));
}
22.给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
c
#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);
}
}
23.一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
c
#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");
}
}
24.请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
c
#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;
}
25.删除一个字符串中的指定字母,如:字符串 "aca",删除其中的 a 字母。
c
#include <stdio.h>
#include <string.h>
// 函数声明
void remove_char(char *str, char ch);
int main() {
char str[100]; // 假设最大长度为100
char ch;
// 输入字符串和要删除的字符
printf("请输入一个字符串: ");
scanf("%s", str);
printf("请输入要删除的字符: ");
scanf(" %c", &ch); // 注意前面有一个空格以忽略前一个输入的换行符
// 调用函数删除指定字符
remove_char(str, ch);
// 输出结果
printf("删除后的字符串: %s\n", str);
return 0;
}
// 删除字符串中的指定字符
void remove_char(char *str, char ch) {
int i, j = 0;
int len = strlen(str);
// 遍历字符串并构建新字符串
for (i = 0; i < len; i++) {
if (str[i] != ch) {
str[j++] = str[i];
}
}
// 添加字符串结束符
str[j] = '\0';
}
26.判断一个数字是否为质数。
c
#include <stdio.h>
#include <math.h>
// 函数声明
int is_prime(int num);
int main() {
int num;
// 输入要检查的数字
printf("请输入一个数字: ");
scanf("%d", &num);
// 判断并输出结果
if (is_prime(num)) {
printf("%d 是质数。\n", num);
} else {
printf("%d 不是质数。\n", num);
}
return 0;
}
// 判断一个数字是否为质数的函数
int is_prime(int num) {
// 小于2的数字不是质数
if (num < 2) {
return 0;
}
// 检查从2到sqrt(num)的所有整数
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0; // 找到因子,不是质数
}
}
return 1; // 没有找到因子,是质数
}
27.对10个数进行排序(选择)。
c
#include <stdio.h>
#define N 10
void selectionSort(int arr[], int n) {
int i, j, minIndex, temp;
for (i = 0; i < n - 1; i++) {
minIndex = i;
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
// Swap the elements
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
}
int main() {
int arr[N];
printf("请输入 %d 个数字:\n", N);
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
selectionSort(arr, N);
printf("排序结果是:\n");
for (int i = 0; i < N; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
28.对10个数进行排序(冒泡)
c
#include <stdio.h>
// 函数声明
void bubble_sort(int arr[], int n);
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr[0]);
printf("原始数组: \n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 调用冒泡排序函数
bubble_sort(arr, n);
printf("排序后的数组: \n");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
// 冒泡排序函数定义
void bubble_sort(int arr[], int n) {
int i, j;
int swapped;
for (i = 0; i < n - 1; i++) {
swapped = 0;
// 每次遍历内层循环都会把当前最大的未排序元素移动到正确位置
for (j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
// 如果在某一轮遍历中没有发生任何交换,说明数组已经有序
if (!swapped) {
break;
}
}
}
29.逆序输出字符串
c
#include <stdio.h>
#include <string.h>
void reverse_print(const char *str) {
int length = strlen(str);
for (int i = length - 1; i >= 0; i--) {
printf("%c", str[i]);
}
printf("\n");
}
int main() {
char str[100];
// 输入字符串
printf("请输入一个字符串: ");
scanf("%99s", str); // 注意防止缓冲区溢出
// 调用函数逆序输出字符串
reverse_print(str);
return 0;
}