目录
10将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
12输入一个字符串,将其内连续的数字转为int型存到一维数组中
42公鸡5钱一只,母鸡3钱一只,小鸡三只一钱,一百钱买一百只鸡
43 一个球从100m的高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高
53 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了
56输入正整数a,b 若为a的平方+b的平方>100,输出百位以上数
64结构体 10个学生 输出三门课的总平均分,以及最高分的学生数据
66 定义一个含有30个整型元素的数组 按顺序赋予从2开始的偶数,然后按顺序以每5个数一组的形式求出平均值并输出
70 输入若干字符,求每串长度。打印最长,以stop作为最后一个字符串
1字符串从第m个字符开始全部复制到另一个字符串
//限制字符串长,并且判断输入数是否在长度内
字符串从第m个字符开始全部复制到另一个字符串
//限制字符串长,并且判断输入数是否在长度内
#include <stdio.h>
void copy_s(char* p, char* q, int m);
int main() {
char a[100], * p = a, i, j, b[10];int m;
printf("请输入字符串:");
gets(a);
printf("请输入从第几个字符开始移动:");
scanf("%d",&m);
if (m <= strlen(a) && strlen(a)<100)
copy_s(a, b, m);
else
printf("超出长度");
printf("%s", b);
return 0;
}
void copy_s(char* p, char* q, int m)
{
strcpy(q,(p + m - 1));
int i = strlen(p);
*(q + i - m + 1) = '\0';
}
//void copy_s(char* p, char* q, int m) {
// int i = 0;
// for (i = 0; *(p + m-1) != '\0'; m++, i++)
小错误,比如reading_room 中要求把第9个字符移动。但是想要移动的r下标是8,。
区分下标和第几,移动加的步长需要-1;
// *(q + i) = *(p + m - 1);
// *(q + i) = '\0';
// printf("%s", q);
//}
//
2指向指针的指针对五个数字排列输出
//输出的时候别忘了取值打印
void sort(char** p);
int main() {
int** p, a[5] = { 4,5,9,0,1 }, * b[5];
int i = 0;
for (; i < 5; i++)
{
b[i] = &a[i];
}
p = b;
sort(p);
for (i = 0; i < 5; i++)
{
printf("%5d", *b[i]); //输出的时候别忘了取值打印
}
return 0;
}
void sort(int** p) {
int i, j, * swap;
for (i = 0; i < 4; i++)
for (j = 0; j < 4 - i; j++)
{
if (*(*(p + j)) > *(*(p + j + 1)))
{
swap = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = swap;
}
}
}
3指向指针的指针对五个字符串排列输出
void sort(char ** p);
int main() {
char** p, a[5][20] = { "ab","xb","cb","nb","db" }, * b[5];
int i = 0;
for (i = 0; i < 5; i++)
{
b[i] = a[i];
}
p = b;
sort(p);
for (i = 0; i < 5; i++)
{
printf("%s\n", b[i]);
}
return 0;
}
void sort(char ** p) {
int i, j, * swap;
for (i = 0; i < 4; i++)
for (j = 0; j < 4 - i; j++)
{
if (strcmp(*(p + j), *(p + j + 1)) > 0)
{
swap = *(p + j);
*(p + j) = *(p + j + 1);
*(p + j + 1) = swap;
}
}
}
4 3*3行列转置
*(p + i * 3 + j) = *(p + j * 3 + i);
#include <stdio.h>
void vome(int* p);
int main() {
int i, j, k, a[3][3], * p = a[0];
for (i = 0; i < 3; i++)
scanf("%d%d%d", &a[i][0], &a[i][1], &a[i][2]);
vome(p);
for (i = 0; i < 3; i++)
printf("%d%d%d\n", a[i][0], a[i][1], a[i][2]);
return 0;
}
void vome(int* p) {
int i = 0, j = 0, swap;
for (i = 0; i < 3; i++)
for (j = i; j < 3; j++) //不用每一个都换,j=i只用换右下角两个
{
swap = *(p + i * 3 + j);
*(p + i * 3 + j) = *(p + j * 3 + i);
*(p + j * 3 + i) = swap;
}
}
5输入十个整数,最小数与第一个交换,最大数与最后数交换
分别求取,最大值和最小值然后交换,以防找不到地址
#define N 10
void swap_s(int* p);
int main() {
int a[N] = { 98,24,56,78,1,32,36,44,29,6 }, * p = a, i, j;
swap_s(p);
return 0;
}
void swap_s(int* p) {
int i, j, * max = p, * min = p, m;
for (i = 0; i < N; i++)
{
if (*(p + i) < *min)
min = p + i;
}
if (p != min) {
m = *min;
*min = *p;
*p = m;
}
for (i = 0; i < N; i++)
{
if (*(p + i) > *max)
max = p + i;
}
if (p + N - 1 != max) {
m = *max;
*max = *(p + N - 1);
*(p + N - 1) = m;
}
}
6输入三个字符串,按由小到大顺序输出
void main() {
char a[3][10] = { {"e gf"},{"b"},{"a"} },(*p)[10]=a, swap[10];
int i, j;
for(i=0;i<2;i++)
for (j = 0; j < 2 - i; j++)
{
if (strcmp(p+j, p + j + 1) > 0)
{
strcpy(swap, a + j);
strcpy(a + j, a +j+1);
strcpy(a + j + 1, swap);
}
}
for (i = 0; i < 3; i++)
printf("%s\n", p + i);
}
7十六进制转十进制
/字符串形式存储十六进制数
/别忘记输入的限制条件为小于四,不然不停止
//字符串形式存储十六进制数
#include <math.h>
int main() {
char a[4], c;//字符串形式存储十六进制数
int i = 0, j;
double sum = 0, k = 0; //定义double类型存储
while ((c = getchar()) != '\n'&&i<4) //别忘记输入的限制条件为小于四,不然不停止
{
if (c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F' || c >= '0' && c <= '9')
a[i++] = c;
}
for (j = i - 1; j >= 0; j--)
{
if (a[j] >= '0' && a[j] <= '9')
sum += (a[j] - '0') * pow(16.0, k++);
if (a[j] >= 'a' && a[j] <= 'f')
sum += (a[j] - 'a' + 10) * pow(16.0, k++);
if (a[j] >= 'A' && a[j] <= 'F')
sum += (a[j] - 'A' + 10) * pow(16.0, k++);
}
printf("%lf", sum);
}
8统计字符串中最长单词和最短单词
注意打印的时候不能为%s输入,只能一个一个打
void main()
{
char s[3000]="i love you", * idx_max = s, * idx_min = s;
int i = 0, max = 0, min = 10, len = 0,l;
//gets(s);
while (s[i] != '\0')
{
for (len = 0; (s[i] != '\0') && (s[i] >= 'a' && s[i] <= 'z' ||s[i] >= 'A' && s[i] <= 'Z'); i++, len++);
if (len > max)
{
max = len;
l = i - len;
idx_max = &s[i - len];
}
if (len < min)
{
min = len;
idx_min = &s[i - len];
}
for (; !(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z') && s[i] != '\0'; i++);
}
printf("最长为%d:", max);
for (i = 0; i < max; i++)
printf("%c", *(idx_max + i));
printf("\n");
printf("最短为%d:", min);
for (i = 0; i < min; i++)
printf("%c", *(idx_min + i));
printf("\n");
}
9整数n变为字符串 递归
直接调用函数,然后回归的时候会执行调用函数下一条语句;不能用return
#include <string.h>
void change_s(int a);
int main() {
int a;
scanf("%d", &a);
if (a < 0)
{
printf("-");
a = -a;
}
change_s(a);
return 0;
}
void change_s(int a) {
if (a / 10 != 0)
change_s(a /10);
printf("%c", a % 10 + '0');
}
10将一个5x5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素
// //(顺序为从左到右,从上到下依次从小到大存放),写一函数实现之。用main函数调用。
// //注意点1.最小值赋值为最大值,这样才能好找
// //2.q首先也指向p指向的地址,以防出现第一个值为最大值,q成为野指针的情况
// //3.直接给p首地址,然后+数来改变p的指向
#include <stdio.h>
#include <string.h>
void transform(int* p, int *q);
void check(int* p)
{
int max = 0, min = 100, i, j, k, * q = p, * a[4] = { p,p + 4,p + 20,p + 24 }, index = 0, swap,flag=1;
for (i = 0; i < 25; i++)
{
if (*(p + i) > max)
{
max = *(p + i);
q = p + i;
}
}
if (q != p + 12)
transform(p + 12, q);
for(k=0;k<4;k++) //遍历求取四个最小值
{
min = 100;
for (i = 0; i < 25; i++) //遍历每一个数,求取最小值
{
flag = 1;
if (*(p + i) < min)
{
for (j = 0; j < index;j++) //判断是不是除前几个已经放置的值以外的最小值,index控制四个角坐标
{
if (p + i == a[j]) {
flag = 0;
break;
}
}
if(flag==1) //是除前几个已经放置的值以外的最小值就交换
{min = *(p + i);
q = p + i;
}
}
}
transform(q, a[index++]);
}
}
void transform(int* p, int *q)
{
int m;
m = *p; *p = *q; *q = m;
}
int main()
{
int arry[5][5] = { 25,34,33,32,31,35,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11 };
//printf("Please enter a 5x5 matrix: \n");
//for (int i = 0; i < 5; i++) {
// for (int j = 0; j < 5; j++) {
// scanf_s("%d", &arry[i][j]);
// }
//}
check(arry);//将二维数组当做一维数组传入处理,并且传入行列数
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%d ", arry[i][j]);
}
printf("\n");
}
return 0;
}
11报数 n个人从3开始报数,输出最后一个人 的位置
问题1:%3==0在i开始循环的时候就会成立,让m==3
问题2:if语句要在m++后
问题3:不要把输入变量当成循环条件--
int main() {
int a[100] = { 0 }, i, j, m = 0, n = 8;
while (n > 1)
{
for (i = 0; i < 8; i++)
{
if (a[i] ==0)
m++;
if (m == 3)
{
m = 0;
a[i] = 1;
n--;
}
}
}
for (i = 0; i < 8; i++)
{
if (a[i] == 0)
printf("%d", i + 1);
}
}
12输入一个字符串,将其内连续的数字转为int型存到一维数组中
int main() {
int d = 0, sum = 0, i, j, a[100], dex = 0; char str[100] = "123fd+45,665f8", * p = str;
for (i = 0; *p != '\0'; p++)
{
if ('0' <= *p && *p <= '9')
{
for (i = 0; '0' <= *p && *p <= '9' && *p != '\0'; p++)
{
d = *p - '0';
sum = sum * 10 + d;
}
a[dex++] = sum;
sum = 0, d = 0;
}
}
printf("%d", dex);
return 0;
}
13四则运算
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
float a=3,b=0;
char op='/';
switch (op) {
case '+': printf("a+b=%f", a + b); break; //直接在后面打印输出
case '-': printf("a-b=%f", a - b); break;
case '*': printf("a*b=%f", a * b); break;
case '/': if (b != 0)
printf("a/b=%f",a/b);
else printf("除数不能为0\n");
}
return 0;
}
14键盘输入字符串a,并在a字符串最大元素后插入字符串b
strcpy不能对同一个字符串同时操作,不然可能有问题。所以拷贝到另一个字符串在复制
#include<string.h>
int main() {
char a[50] = "14690178", b[4] = "000", e[10];
int i = 0, j, inde = 0;
/* gets(a);*/
int a_l = strlen(a), b_l = strlen(b);
for (i = 0; a[i] != '\0'; i++)
{
if (a[inde] < a[i])
inde = i;
}
strcpy(e, a + inde + 1);
strcpy(a + inde + 1, b);
strcat(a, e);
printf("%s",a);
}
15结构体日期排序
struct rq {
int mon;
int day;
int year;
};
int main() {
int i, j;
struct rq t, a[6] = { 12, 31 , 2005,
10 , 21 , 2003,
11 , 12 ,2003,
10 ,5 , 1999,
10 , 22 , 2003,
11 , 30, 2005 };
for (i = 0; i < 5; i++)
for (j = 0; j < 5 - i; j++)
{
if (a[j].year == a[j + 1].year)
{
if (a[j].mon >= a[j + 1].mon)
{
if (a[j].mon > a[j + 1].mon)
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
else if (a[j].day > a[j + 1].day)
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
else if (a[j].year > a[j + 1].year) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
16从键盘输入的偶数写成两个素数之和
条件只写为<= a / 2
#include<stdio.h>
main()
{
int a=10, b, c, d;
for (b = 3; b <= a / 2; b += 2) //b为a分解后其中一个小于a/2的一个素数
{
for (c = 2; c <= sqrt(b); c++) //这个循环是判断b是不是素数,用2-b的开方之间的数去处
if (b % c == 0)
break; //如果其中有一个数可以整除b,就中断该循环
if (c > sqrt(b))
d = a - b; //循环后判断c如果c最后的值>sqrt(b),表示它不是中途用break
else continue; //来退出循环的,表示b是一个素数,如b是素数,则继续判断a-b是
for (c = 2; c <= sqrt(d); c++) //否是素数,否则再换另一个b
if (d % c == 0)
break;
if (c > sqrt(d))
printf("%d=%d+%d\n", a, b, d);
}
}
17删除重复数
数组长度必须不断变化
j--; //必须回退一次,不然紧挨着的两个重复数字会漏删
字符串要每次都插入'\0'
数字字符串len-(删除数)
int main() {
int s[21] = { 1,2,2,2,3,2,5,7,8,5,9};
int a=10, b, c, f, i=0, j=0, r,k; //a为len,要不断变化
for(i=0;i<a;i++)
for (j = i + 1; j < a; j++)
{
if (s[i] == s[j])
{
for (k = j; k < a-1; k++) //单独赋值,不然j变化后后面的重复值不在寻找
{
s[k] = s[k + 1];
}
a--;
j--; //必须回退一次,不然紧挨着的两个重复数字会漏删
}
}
for (i = 0; i < a; i++)
printf("%3d", s[i]);
return 0;
}
#include<stdio.h>
#include<string.h>
int main() {
int i, j,n=7,k;
char a[100] = "12222ab24r6664285433";
for (i = 0; a[i] != '\0'; i++)
{for(j=i+1,k=j;a[j]!='\0';j++)
if (a[j] != a[i])
{
a[k++] = a[j];
}
a[k] = '\0';
}
printf("%s", a);
return 0;
}
int main() {
int s[21] = { 1,2,2,2,3,2,5,7,8,5,9,11};
int a = 12, b, c, f, i = 0, j = 0, r, k; //a为len,要不断变化
for (i = 0; i < a; i++)
{
for (j = i + 1, k = j;j<a; j++)
if (s[j] != s[i])
{
s[k++] = s[j];
}
a = a - (j - k);
}
for (i = 0; i < a; i++)
printf("%3d", s[i]);
return 0;
}
18八进制转十进制
sum和i从0开始
int main() {
char a[10] = "123";
int sum = 0;
int len = strlen(a),i;
for (i = 0; i < 3; i++)
sum = sum * 8 + a[i] - '0';
}
19两个排好序的字符串升序并归到到字符串c
c[n] = '\0'; //忘记不写不能运行strcat
#include <stdio.h>
int main()
{
char a[10] = "125", b[10] = "256789", c[20], * p = a;
int n = 0, i, j, k;
for (i = 0, j = 0; a[i] != '\0' && a[j] != '\0';)
{
if (a[i] < b[j])
c[n++] = a[i++];
else c[n++] = b[j++];
}
c[n] = '\0'; //忘记不写不能运行strcat
if (a[i] != '\0')
{
p = a + i;
strcat(c, p);
}
else
{
p = b + j;
strcat(c, p);
}
return 0;
}
20字符串转化为整数
考虑负数情况
int main() {
int i=0, j = 0, k = 0, h = 1, sum = 0,flage=1;
char a[20] = "-1234";
int n = strlen(a)-1;
if (a[0] == '-')
{
flage = -1;
i = 1;
}
for (; i <= n; i++)
sum = sum * 10 + a[i] - '0';
printf("%d", sum*flage);
}
21九九乘法表输出右上三角形
j=1;j<i
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= 9; j++) {
if (j < i)
printf("\t"); //进行对空格
else
printf("%d*%d=%2d\t", i, j, i * j);
}
printf("\n");
}
return 0;
}
22母串中字符串个数
注意点 子串下标每次都清零,不然只能输出一个子串数。母串的下标要单独赋值给一个数进行遍历,这样返回外循环才不会错过下一个字符串。for循环是单独语句。
#include <stdio.h>
int main(void)
{
char str[20] = "aacbac", substr[20] = "ac";
int i = 0, j = 0, k = 0, number = 0;
for (i = 0; str[i] != '\0'; i++)//从母串开始遍历
{
for (k = 0,j=i; str[j] == substr[k]&&str[j] != '\0' && substr[k] != '\0'; j++, k++);
if (substr[k] == '\0')
number++;
}
printf("substr在str出现的次数为%d\n", number);
return 0;
}
23打印菱形
别忘记换行
#include <stdio.h>
void main()
{
int i, j, k,n=9;
for (i = 0; i < n/2; i++)
{
for (j = 0; j < n / 2 - i; j++)
printf(" ");
for (k = 0; k < 2 * i + 1; k++)
printf("*");
printf("\n");
}
for (i = (n + 1) / 2; i >0; i--)
{
for (j = 0; j <(n+1)/2- i; j++)
printf(" ");
for (k = 0; k < 2 * i - 1; k++)
printf("*");
printf("\n");
}
}
24求质因数
88=2*2*2*11
80到不能被2整除的时候换成3,3不能被整除的时候换成4
main(void)
{
int m = 88, j = 2, i,k=1;
for (i = 2; i <= sqrt(m); i++)
{
while (m%i== 0) {
printf("%d*", i);
m = m / i;
}
}
}
main()
{
int n,i;
printf("\nplease input a number:\n");
scanf("%d",&n);
printf("%d=",n);
for(i=2;i<=n;i++)
while(n!=i)
{
if(n%i==0)
{
printf("%d*",i);
n=n/i;
}
else
break;
}
printf("%d",n);
}
25一角加两角加五角得到2元
可以用一毛来限制个数就直接用3个循环写吧
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include<stdio.h>
void main()
{
int i, j, k, flag = 0;
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= 5; j++)
{
k = 10 - 5 * i - 2 * j;
if (k >= 0 && k <= 10)
{printf("%d %d %d\n", i, j, k); flag++; }
}
}
printf(" % d",flag);
}
#include<stdio.h>
int main()
{
int one,two,five,x;
scanf("%d",&x);
for(one=1;one<x*10;one++)
{
for(two=1;two<x*10/2;two++)
{
for(five=1;five<x*10/5;five++)
{
if(one+two*2+five*5==x*10)
{
printf("可以用%d个1角加%d个2角加%d个5角得到%元\n",one,two,five,x);
}
}
}
}
return 0;
}
26判断该日为该年第几天
判断日期是否从 三月 开始
#include <stdio.h>
struct year {
int year;
int month;
int day;
};
int main() {
struct year rq;
printf("请输入计算的年,月,日");
scanf("%d,%d,%d", &rq.year, &rq.month, &rq.day);
int a[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 },i,sum=0;
for (i = 1; i < rq.month; i++) //最后一个月的月份不累加,直接加日期
sum+= a[i];
sum = sum + rq.day;
if ((rq.year % 4 == 0 && rq.year % 100 != 0 || rq.year % 400 == 0) && rq.month >= 3)
/*判断是否为闰年,可以被四整除不能被100整除。可以被四百整除。并且从 三月 开始*/
sum = sum + 1;
printf("%d", sum);
return 0;
}
27结构体候选人投票
#include <stdio.h>
#include <string.h>
#define N 10
struct poll {
char name[10];
int ps;
}hxr[3] = { "lihua",0,"lihua1",0 , "lihua2",0};
int main() {
int i, j; char namen[10];
for (i = 0; i < N; i++)
{
scanf("%s",namen);
for (j = 0; j < 3; j++)
{
if (strcmp(namen,hxr[j].name) == 0)
hxr[j].ps++; //对比候选人姓名,谁名字一样谁++
}
}
for (i = 0; i < 3; i++)
printf("候选人为%s,其票数为%d\n",hxr[i].name,hxr[i].ps);
return 0;
}
28升序数组插入元素
打印时要加插入数字长度,可以直接和尾元素比较,看是不是要直接插入最后。在循环前写if else
#include <stdio.h>
int main() {
int i, j, m=11, s;
int a[20] = {0,1,2,3,4,5,6,7,8,9};
//scanf("%d", &m);
for (i = 0; i < 10 && m>a[i]; i++);
if (i < 10) //注意插入头尾
{
for (j = 10; i < j; j--)
a[j] = a[j - 1];
a[i] = m;
}
else
a[i] = m;
for (i = 0; i < 11; i++) //打印时要加插入数字长度
printf("%3d", a[i]);
return 0;
}
29数字的正序输出,统计个数,递归
可以用全局变量接收个数
int fun(int a, int* p) {
if (a / 10 != 0)
fun(a / 10, p);
printf("%d", a % 10);
(*p)++;
}
int main() {
int a=0, g, s = 0, i=0, j,z=2, f[5],*p=&a;
fun(485, p);
return 0;
}
30不多于五位的正数,几位数,分别输出每一位,逆序输出
int main() {
int a, g, s = 0, i = 0, j, z = 2, f[5];
scanf("%d",&a);
if (a > 0 && a <= 99999)
while (a != 0)
{
f[i++] = a % 10; //放在a前面不然最后一位a会为0,,不进行存储
s++;
a = a / 10;
}
for (j = 0; j < i; j++)
printf("%3d", f[j]);
printf("\n");
for (; 0 < i; i--)
printf("%3d", f[i - 1]); //i已经自加1指向存储数据的后一位,所以在运行时要-1
return 0;
}
31选择排序
找到的元素从前向后排列,j = i + 1
int main() {
int a[10] = { 9,6,4,7,8,3,1,5,12,31 };
int b, min, i, r, j;
for (i = 0; i < 9; i++)
{
min = i;
for (j = i + 1; j < 10; j++)
if (a[min] > a[j])
min = j;
if (min != i)
{
r = a[min];
a[min] = a[i];
a[i] = r;
}
}
for (i = 0; i <= 9; i++)
printf("%3d", a[i]);
return 0;
}
32冒泡排序
找到的数从最后往前放
int main() {
int a[10] = { 9,6,4,7,8,3,1,5,12,31 };
int b, min, i, r, j;
for (i = 0; i < 9; i++)
{
for(j=0;j<9-i;j++) //注意越界问题,len-1-i
if (a[j] > a[j + 1])
{
r = a[j];
a[j] = a[j + 1];
a[j + 1] = r;
}
}
for (i = 0; i <= 9; i++)
printf("%3d", a[i]);
return 0;
}
33乒乓球队比赛
int main()
{
char a, b, c;
for (a = 'X'; a <= 'Z'; a++)
{
for (b = 'X'; b <= 'Z'; b++)
{
for (c = 'X'; c <= 'Z'; c++)
if (a !='X'&&c!='X' && c != 'Z'&&a!=b&&b!=c&&a!=c)
printf("a--%c,b--%c,,c--%c\n", a,b,c);
}
}
return 0;
}
34二次方程的根
#include <stdio.h>
#include <math.h>
int main() {
double a, b, c;
double sum,e,p,q;
scanf("%lf,%lf,%lf", &a, &b, &c); //用double类型,注意输入格式
while (1) {
if (fabs(a)<=1e-3)
scanf("%lf", &a);
else
break;
}
e = b * b - 4 * a * c;
if (fabs(e) <= 1e-6) {
p = -(b / (2 * a));
printf("两个相等的实根:%8.4f\n", p);
}
else if (e > 1e-6) //进来以后判断不要加绝对值
{
p = (-b - sqrt(e)) / (2 * a);
q = (-b + sqrt(e)) / (2 * a);
printf("两个不等的实根:x1 = %8.4f x2 = %8.4f\n", p, q);
}
else
{
p = -b / (2 * a); //复根的实部
q = sqrt(-e) / (2 * a); //复根的虚部,b方-4ac小于零,所以要取负数
printf("%8.4f+%8.4fi\n", p, q);
printf("%8.4f-%8.4fi\n", p, q);
}
return 0;
}
35两个排好序的字符串升序并归到到字符串c
1.用if else语句,这样两个字符串值相等的时候才不会死循环
2.'\0'
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char a[10] = "1257", b[10] = "25689", c[20], * p = a, * q = b;
int n = 0, i, j, k;
while (*p || *q)
{
if (*p != '\0' && *p <= *q)
c[n++] = *(p++);
else
c[n++] = *(q++);
}
c[n] = '\0';
printf("%s", c);
return 0;
}
36水仙花数 三位正整数每一位立方和
int main() {
int i = 0;
int a = 0;
int b = 0;
int c = 0;
int sum = 0;
for (i = 100; i <= 999; i++) {
a = i / 100;
b = i / 10 % 10;
c = i % 10;
sum = a * a * a + b * b * b + c * c * c;
if (sum == i) {
printf(" %d", i);
}
}
return 0;
}
37阶乘递归
int fun(int x) {
if (x == 1||x==0) {
return 1;//1!=1;
}
else
return x * fun(x - 1);
}
38筛选法求素数
///*把从1开始的、某一范围内的正整数从小到大顺序排列,
//1不是素数,首先把它筛掉。
//剩下的数从2开始遍历到sqrt(100),然后去掉它的倍数*/
#include <math.h>
int main() {
int i, j, b, a[101];
for (i =1; i < 101; i++)
a[i] = i;
a[1] = 0;
for(i=2;i<=sqrt(100);i++)
for (j = i+1; j < 100; j++) {
if (a[j] % i == 0)
a[j] = 0;
}
for (i = 2; i <100; i++) //因为1不是素数,所以从2开始遍历输出素数
if(a[i]!=0)
printf("%3d", a[i]);
return 0;
}
39比较字符串
#define n 6
int main()
{
int i;
char a[15]="1234", b[15]="123";
/*gets(a);
gets(b);*/
for (i = 0; i < 15 && a[i] != '\0' && a[i] == b[i] && b[i] != '\0';i++);
if (a[i] == '\0' && b[i] == '\0')
printf("相等");
else printf("%d", a[i] - b[i]);
return 0;
}
40杨辉三角之等腰输出
注意打印,别的地方未初始化,打印赋值的地方
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int i, j, n = 7, k;
//首先定义二维数组计数符号i,j 还有杨辉三角行数的初始化
int a[7][7] = { 0 };
for (i = 0; i < n; i++)
{ for (j = 0; j <= i; j++)
if (j == 0 || i == j)
a[i][j] = 1;
else
a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
}
for (i = 0; i < n; i++)
{
for (j = 0; j <n-i; j++)
printf("\t");
for (k = 0; k <= i; k++)
{
printf("%d\t",a[i][k]);
printf("\t");
}
printf("\n");
}
return 0;
}
41十进制数转化成N进制
#include<stdio.h
void main()
{
int bas, num, a[18], i, j;
printf(“Input a shi jin zhi zhengshu and jin zhi : ”);
scanf(“ % d, &d”, &num, &bas);
for (i = 0; num; i++) //num变为0时停止循环
{
a[i] = num % bas;
num = num / bas;
}
for (j = i - 1; j >= 0; j--) //输出
printf(“ % d”, a[j]);
}
42公鸡5钱一只,母鸡3钱一只,小鸡三只一钱,一百钱买一百只鸡
#include<stdio.h>
int main()
{
int a, b, c;
for (a = 0; a <= 20; a++)//买的公鸡的数量
for (b = 0; b <= 33; b++)//母鸡的数量
{
c = 100 - a - b;//小鸡的数量 //c=3*(100-5*a-3*a) //算剩下的钱能买多少鸡
if (a * 5 + b * 3 + c / 3.0 == 100) //小鸡的钱数 //if(a+b+c==100)//算三个加一起的个数
printf("%d %d %d\n", a, b, c);
}
return 0;
}
43 一个球从100m的高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第10次落地时共经过多少米,第10次反弹多高
反弹再落地不只计算了一次
int main()
{
int i = 1;
double a = 100, b, c, sum = 100;
for (; i <= 10; i++)
{
a = a * 1 / 2;
sum +=a * 2;
}
printf("%lf\n", a);
printf("总共距离%lf", sum);
return 0;
}
44排好序的数组输入一个数,按原来的规律插入
注意插入数在数组末尾和数组中间两种情况
打印的时候数组长度也+1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include<string.h>
int main() {
int a[10] = { 1,2,4,5,9,10 };
int i, j = 6, s, xb;
scanf("%d", &s);
for (i = 0; i < j;i++)
if (s < a[i])
break;
if (i >= j)
a[j] = s;
if (i < j)
{
for (; j > i; j--)
{
a[j] = a[j - 1];
}
a[i] = s;
}
for (i = 0; i <7; i++)
printf("%3d", a[i]);
return 0;
}
45 1000以内的完数
第一个完全数是6,它有约数1、2、3、6,除去它本身6外,其余3个数相加
int main()
{
int num, sum, i;
for (num = 1; num <= 1000; num++)
{
sum = 0; //忘记 每次判断一个数都要将 sum 初始化为 0
for (i = 1; i < num; i++)
if (num % i == 0)
sum += i;
if (sum == num)
printf("%d\n", num);
}
return 0;
}
46数组逆序存放
int main() {
int a[5] = { 1,2,4,5,9 };
int i, j = 5, s, xb;
for (i = 0,s=j-1; i < 5 / 2; i++,s--)
{
xb = a[i];
a[i] = a[s];
a[s] = xb;
}
for (i = 0; i <5; i++)
printf("%3d", a[i]);
return 0;
}
47打印鞍点 其为行上最大值,列上最小值
别忘了没找到的情况
int main()
{
int a[4][5] = { 1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20 }, b,k, i, j,max,index, flag ;
for (i = 0; i < 4; i++)
{
max = a[i][0], index = 0;
for (j = 0; j < 5; j++)
if (a[i][j] > max)
{max = a[i][j];
index = j;}
flag = 1; //每次遍历记得重置
for (b = 0; b < 4; b++)
{
if (a[b][index] < max)
{
flag = 0; //借助数字变化进行判断是否找到
break;
}
}
if (flag)
{
printf("%d", max);
break;
}
}
if (flag == 0)
{
printf("no");
}
return 0;
}
48 折半查找
注意点1 输入数字是否在范围内
注意点2 查找数字是否在范围内,用flag来判断
#define n 8
void main()
{
int a[n] = {2,3,4,5,6,8,9,10 };
int m, left=0, right=n-1,k,flag=0,index; //取到最后一位 或者用sizeof(a)/sizeof(a[0])-1 左闭右闭
scanf("%d", &k);
while (left <= right)
{
m = (left + right) / 2;
if (k > a[n - 1] || k < a[0]) //判断是否不在排好序的数组内部
{
flag = 0;
printf("输入错误");
break;
}
if (k < a[m])
right = m -1;
else if (k == a[m]){
flag = 1;
break;
}
else
left = m + 1;
}
if (flag == 1)
printf("%d", m + 1);
else printf("未找到");
}
49 数组从前向后移动n位
注意点 数组的长度重复使用,要每次赋值给循环元素,以防无法进行下次循环
void move_S(int* p, int m, int n);
int main() {
int a[8] = { 12,43,65,67,8,2,7,11 };
int * p = a;
move_S(p, 8,7);
return 0;
}
void move_S(int* p, int m, int n) {
int i, j, last;
for (i = 0; i < n; i++)
{
last = *(p + m - 1);
for (j = m-1; 0 < j ; j--) //不能直接用m--
{
*(p + j) = *(p + j - 1);
}
*p = last;
}
}
50 编写一个函数实现两个字符串的比较
注意点 返回值为两个指针值的差,不是同一个指针不能进行+-
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int str_m(char* p1, char* p2);
int main() {
char a[] = "CHINA", * p1 = a;
char b[] = "CHINA", * p2 = b;
printf("%d", str_m(p1, p2));
return 0;
}
int str_m(char* p1, char* p2) {
for (; *p1 == *p2 && *p1 != '\0' && *p2 != '\0'; p1++, p2++); //遍历字符串相等的部分
if (*p1 != '\0' || *p2 != '\0')
return *p1 - *p2;
else return 0;
}
51 重要 报数
if (a[i] != 1)
int main() {
int i = 0, k = 0, a[8] = { 0 }, n = 8;
while (n > 1) {
for (i = 0; i < 8; i++)
{
if (a[i] != 1)
k++;
if (k == 3)
{
a[i] = 1;
n--;
k = 0;
}
}
}
return 0;
}
52 最小公倍数
//注意ab值已经在循环中改变,所以不能直接乘
辗转相除
int main() {
int a = 12, b = 8,r,sum= a * b;
while (r = a % b) {
a = b;
b = r;
}
printf("%d", sum/ a); //注意ab值已经在循环中改变,所以不能直接乘
return 0;
}
53 猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃了一个;以后每天都吃前一天剩下的一半多一个,到第10天想再吃时,只剩下一个桃子了
int f(int n) {
if (n == 1)
return 1;
else return (f(n - 1) + 1) * 2.0 ;
}
int main()
{
int c;
c=f(10);
printf("%d", c);
return 0;
}
if (day == 10)
return 1;
else
return 2 * sumpeach(day + 1) + 2;
54四个数字组成多少种不重复的三位数 偶数
int main() {
int i, j,k,sum=0;
for (i = 1; i <=9; i++) {
for (j = 0; j <= 9; j++) {
for (k = 0; k <= 9; k=k+2)
if (i != j && i != k && k != j)
sum++;
}
}
printf("%d\n", sum);
return 0;
}
55百分制成绩
输入数是否合法
int main() {
float a, b;
int g;
while (scanf("%f", &a), a > 100 || a < 0);
g = a / 10;
switch(g){
case 10:case 9: printf("A"); break;
case 8: printf("B"); break;
case 7: printf("C"); break;
case 6: printf("D"); break;
default: printf("E");
}
return 0;
}
56输入正整数a,b 若为a的平方+b的平方>100,输出百位以上数
int main() {
int a, b, c;
while ((scanf("%d%d", &a, &b), a < 0 || b < 0));
if ((c = a * a + b * b) > 100)
printf("%d", c / 100);
return 0;
}
57 输出字符串长度
#include <stdio.h>
int len(char * p);
int main() {
char a[100], * p = a, m;
gets(a);
printf("%d", len(p));
return 0;
}
int len(char * p) {
int i;
for ( i = 0; *(p + i) != '\0'; i++);
return i;
58 将n个数按输入时候的顺序逆序输出
void sort(int* p, int m);
int main() {
int a[10] = {10,9,8,7,6,5,4,3,2,1}, i, j, * p = a, * q, m;
sort(p, 10);
return 0;
}
void sort(int* p, int m) {
int i, j, * q, sw;
q = p + m - 1;
for (i = 0; i <5; i++,q--)
{
sw = *(p + i);
*(p + i) = *q;
*q = sw;
}
}
59 2*22*222
1+12+123+ a = a * 10+i;
1+22+333+4444+nnnn
for (i = 1; i <= n; i++) { //打印几个数
m = 0;
for (j = 1; j <= i; j++) //每个数怎么算
m = m * 10 + i;
s += m; //语句不能放在for循环内
int main() {
int i ;
int a = 0;
int b = 0;
int sum = 0;
for (i = 1; i <= 5; i++) {
a = a * 10 + 2; //前一项×10+2
sum += a;
printf(" %d", a);
}
printf(" %d", sum);
return 0;
}
60 数组插入
#include <stdio.h>
#include <string.h>
int main() {
char a[20] = "cehiknqtw";
char s[] = "agh";
int j;
int e = strlen(a),f=strlen(s);
for (int i = 0; s[i] != '\0'; i++) { //将所有字符都插入
j = 0;
while (s[i] >= a[j] && a[j] != '\0') //这个while循环找到插入位置
j++;
for (int k = strlen(a) - 1; k >= j; k--) { //这个for循环将后面的所有字符向后移一位
a[k + 1] = a[k];
}
a[j] = s[i]; //最后赋值到正确的位置
}
a[e + f] = '\0';
printf("%s", a);
}
61 数组指针 对字符串进行排序
#include <stdio.h>
#include<string.h>
void sort(char (*p)[10]);
int main()
{
int i, j;
char a[5][10]={ "Follow","Basic","Great","F","Compu" } ,(*p)[10] = a;
/* for (i = 0; i <5 i++)
gets(p + i);*/
sort(p);
for (i = 0; i < 5; i++)
printf("%s\n", a[i]);
return 0;
}
void sort(char(*p)[10])
{
char m[10];
int i, j, k;
for (i = 0; i < 5 - 1; i++)
{
for (j = 0; j < 4 - i; j++)
if (strcmp(p[j], p[j + 1]) > 0)
{
strcpy(m, p[j]);
strcpy(p[j], p[j + 1]);
strcpy(p[j + 1],m);
}
}
}
63指针数组 对字符串进行排序
void sort(char* p[5]);
int main()
{
int i, j;
char a[5][10] = { "Follow","Basic","Great","F","Compu" }, *p[5];
for (i = 0; i < 5; i++)
p[i]=a[i];
sort(p);
for (i = 0; i < 5; i++)
printf("%s\n", p[i]);
return 0;
}
void sort(char *p[5])
{
char * m;
int i=0, j=0, k;
for (i = 0; i < 5 - 1; i++)
{
for (j = 0; j < 4 - i; j++)
if (strcmp(p[j], p [j + 1]) > 0)
{
m = p[j];
p[j] = p[j + 1];
p[j + 1] = m;
}
}
}
64结构体 10个学生 输出三门课的总平均分,以及最高分的学生数据
别忘记声明函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define N 2
struct student {
int num;
char name[8];
float score[3];
float avr;
}stu[N];
void input_n(struct student stu[]);
struct student output_n(struct student stu[]);
void print(struct student stu);
int main() {
input_n(stu);
print(output_n(stu));
return 0;
}
void input_n(struct student stu[]) {
int i, j;
for (i = 0; i < N; i++)
{
printf("请分别输入%d学号,姓名:",i+1);
scanf("%d%s%f%f%f", &stu[i].num, stu[i].name,&stu[i].score[0],&stu[i].score[1], &stu[i].score[2]);
stu[i].avr = (stu[i].score[1] + stu[i].score[0] + stu[i].score[2])/3.0;
}
}
struct student output_n(struct student stu[]) {
int max = 0;
for (int i = 0; i < N; i++)
{
if (stu[max].avr < stu[i].avr)
max = i;
}
return stu[max];
}
void print(struct student stu) {
printf("最高分为%s同学,成绩为%f", stu.name, stu.avr);
}
65 打印同构数
它出现在平方数的右边。
如5是25右边的数,25是625右边的数,5和25均是同构数。
if (i * i % 10 == i || i * i % 100 == i || i * i % 1000 == i)
66 定义一个含有30个整型元素的数组 按顺序赋予从2开始的偶数,然后按顺序以每5个数一组的形式求出平均值并输出
问题点 i%5 时为0,可以进入if语句
#include<stdio.h>
main()
{
int a[30], i, j = 2, b = 0, e = 0, c; float ave[10],sum=0;
for (i = 1; i <=30; i++, j = 2 + j)
{
a[i] = j;
sum += a[i];
if (i % 5 == 0)
{
ave[e++] = sum / 5.0;
sum = 0;
}
}
for (i = 0; i < 30; i++)
{
printf("%d\t", a[i]);
j++;
if (j % 5 == 0)
printf("\n");
}
}
67 指针数组编程输出月份的英文表示
声明
数组长13 判断输入合法
#include <stdio.h>
char* getmonth(int n);
int main()
{
int n;
char* s;
char* p = NULL;
scanf("%d", &n);
if (n >= 1 && n <= 12)
printf("%s\n", getmonth(n));
else
printf("wrong input!\n");
return 0;
}
char* getmonth(int n)
{
//指针数组
char* month[13] = { "0", "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December" };
return month[n];
}
68 魔方阵
行列元素保存在赋值后做,并且别忘记判断输入是否为奇数小于预定义数组长
#include<stdio.h>
int main()
{
int n, a[100][100] = {0}, i, j, k, h_i = 1,l_i = 1, c, b;
while (1)
{
scanf("%d", &n);
if ((n != 0) && (n <= 100) && n >= 3 && (n % 2 != 0))
{
break;
}
}
a[0][1] = 1;
h_i = 0; l_i = 1;
for (i = 1; i < n*n; i++)
{
h_i-= 1; l_i+= 1;
if (h_i < 0)
h_i = n-1;
if (l_i >=n)
l_i = 0;
if (a[h_i][l_i]!= 0)
{
h_i = c + 1;
l_i = b;
}
a[h_i][l_i] = i + 1;
c = h_i; b = l_i;
}
for (i = 0; i < n; i++)
{
for (j = 0; j <n; j++)
{
printf("%5d", a[i][j]);
}
printf("\n");
}
return 0;
}
69九阶方阵
1 1 1 1 1 1 1 1 1
1 2 2 2 2 2 2 2 1
1 2 3 3 3 3 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 4 4 3 2 1
1 2 3 3 3 3 3 2 1
1 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1
int main() {
int s[9][9] ;
int a=9, b, c, f, i=0, j=0, r,k;
for(i=1;i<=(a+1)/2;i++) //遍历循环次数,为要填充的数
for (j = i-1; j <= a - i; j++) //每个方阵要打印的个数
{
s[i - 1][j] = i;
s[j][i-1] = i;
s[a-i][j] = i;
s[j][a - i] = i;
}
return 0;
}
70 输入若干字符,求每串长度。打印最长,以stop作为最后一个字符串
strcmp(p, "stop") == 0
#include <string.h>
int main() {
char a[10][15] = {"abc","e","qwert","stop","12"}, (*p)[15] = a, (*q)[15] = a;
int sum = 0, i, j,max=0,le[10];
for (i = 0; i < 10; i++, p++)
{
//gets(p);
if (strlen(a[i]) > max)
{
max = strlen(a + i);
q = p;
}
le[i] = strlen(a + i);
if (strcmp(p, "stop") == 0)
break;
}
printf("%s", q);
}
二分法求方程根
#include <stdio.h>
#include <math.h>
int main() {
double x0, x1, x2, f0, f1, f2;
do {
printf("请输入两个点:");
scanf("%lf,%lf", &x1, &x2);
f1 = ((2 * x1 - 4) * x1 + 3) * x1 - 6;
f2 = ((2 * x2 - 4) * x2 + 3) * x2 - 6;
printf("f1 = %f, f2 = %f\n", f1, f2);
} while (f1 * f2 > 0);
do {
x0 = (x1 + x2) / 2;
f0 = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
if (f0 * f1 < 0) {
x2 = x0;
f2 = f0;
}
else {
x1 = x0;
f1 = f0;
}
} while (fabs(f0) >= 0.00001);
printf("方程根为:%lf\n", x0);
return 0;
}
打印螺旋方阵
#include<stdio.h>
int main()
{
int i, j = 1, a[7][7],n=7,c=0;
while (n-2!=0)
{
for (i =c; i < n;i++,j++)//向右
a[c][i] = j;
for (i =c+1; i < n; i++, j++)//向下
a[i][n - 1] = j;
for (i = n-2; i >=c; i--, j++)//向左
a[n-1][i] = j;
for (i = n - 2; c+1<=i; i--, j++) //向上
a[i][c] = j;
c++; n--;
}
for (i = 0; i < 7; i++) //列数已经自减,打印的时候注意
{
for (j = 0; j < 7; j++)
printf("%4d", a[i][j]);
printf("\n");
}
return 0;
}
牛顿迭代法求根
#include <stdio.h>
#include <math.h>
int main() {
float a,f,f1;
float x=1.5, x1;
f = 2 * pow(x, 3) - 4 * pow(x, 2) + 3*x - 6;
f1 = 6 * pow(x, 2) - 8 * x + 3;
x1 = x - f / f1;
while (fabs(x1-x) >= 1e-5) {
x = x1;
f = 2 * pow(x, 3) - 4 * pow(x, 2) + 3*x - 6;
f1 = 6 * pow(x, 2) - 8 * x + 3;
x1 = x - f / f1;
}
printf("%f", x1);
}
冒泡法字符排序
#define n 6
void px(char a[]);
int main()
{
int i;
char a[10];
scanf("%s", a);
if (strlen(a) <= 10)
{
px(a);
}
else
while (1) {
if (strlen(a) <= 10)
{
px(a);
break;
}
else { printf("输入超出范围");
scanf("%s", a);
}
}
printf("%s", a);
return 0;
}
void px(char a[]) {
char m;
int i, j;
for(i=0;i<strlen(a)-1;i++)
for (j = 0; j < strlen(a) - 1-i;j++)
{
if (a[j] > a[j + 1])
{
m = a[j];
a[j] = a[j + 1];
a[j + 1] = m;
}
}
}