我就是觉得C的作业比C++的难多了呜呜呜
目录
1.有一个函数如下:x -(x<5) x+6 -(5<=x<15) x-6 -(x>=15) 输入x的值,计算出相应的y值。
3.求一个 3x3 矩阵主对角线元素之和 【 反斜杠 \ --主对角线,斜杠 / --副对角线】
4.求 100~999 之间的水仙花数。所谓水仙花数,是指一个3位数,它的每位数字的立方之和等于该数。例如,因为 153-=1+5+3,所以 153 为水仙花数。
5.输入百分制成绩,并把它转换成五级分制,转换公式为:A(优秀)90~100,B(良好)80~89,C(中等)70~79,D(合格)60~69
7.编写一个程序,将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为 1,4,5,6,8。
8.编写一个程序根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角三角形)。
9.从键盘输入若干个学生成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。
10.编写函数将化氏温度转换为摄氏温度,公式为C=(F-32)*5/9;并在主函数中调用。
11.输入一个自然数,输出其各因子的连乘形式,如输入 12,则输出 12=1*2*2*3。
11.1 用了数组,有危险【救命时隔多日我已经看不懂自己写的代码了,请一定好好命名】
12.N个整数从小到大排列,输入一个新数插入其中,使 N+1 个整数仍然有序。
13.在 100~200 之间找出满足用3除余2,用5除余3和用7除余2的所有整数
14.输入 10 个同学的成绩,统计 80 分以上和不及格的人数,并输出平均值
15.编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是 26 个英文字母。
16.编写一个程序,从键盘输入半径和高,输出圆柱体的底面积和体积。
17.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
18.编写程序,形成如下矩阵,并输出。A=[ 11111 21111 32111 43211 54321 ]
20.编写一个程序,将整数转换成字符串:void itoa(int,char);
21.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
24.国际象棋有8x8格,每个格子可放一个棋子。皇后的规则是可以横、竖、斜移动。在一个棋盘放置8个皇后,并使它们互相无法威胁到彼此。
26.有一分数序列:1/2,1/4,1/6,1/8….,用函数调用的方法,求此数列前 20项的和。
27.已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
29.有一个 16 位的整数,每4位为一个数,写函数求他们的和。比如:整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制为 36)
1.有一个函数如下:x -(x<5) x+6 -(5<=x<15) x-6 -(x>=15) 输入x的值,计算出相应的y值。
#include<stdio.h>//排除区间偷懒,当然我写的时候还不会&&/笑哭
int main() {
int x,y;
scanf_s("%d", &x);
if (x < 5) {
y = x;
}
else if (x>=15) {
y = x - 6;
}
else {
y = x + 6;
}
printf("%d\n", y);
return 0;
}
2.输入一个小写字母,将其转换为大写字母。
#include<stdio.h>
int main() {
char dada;
char DADA;
printf("请输入一个小写字母\n");
scanf_s("%c", &dada);
DADA = dada - 'a' + 'A';
printf("%c的大写字母是%c\n", dada,DADA);
return 0;
}
3.求一个 3x3 矩阵主对角线元素之和 【 反斜杠 \ --主对角线,斜杠 / --副对角线】
#include<stdio.h>
int main(){
const int s=3;
int a[s][s];
int t,i;
for(i=0;i<s;i++){
for(t=0;t<s;t++){
scanf("%d",&a[i][t]);
}
}
printf("矩阵所有单元为\n");
for(i=0;i<s;i++){
for(t=0;t<s;t++){
printf("a[%d][%d]%d\t",i,t,a[i][t]);
}
printf("\n");
}
int he=0;
printf("\n");
for(i=0;i<s;i++){
he+=a[i][i];//不要多走循环了
}
printf("主对角线之和为%d\n",he);
return 0;
}
4.求 100~999 之间的水仙花数。所谓水仙花数,是指一个3位数,它的每位数字的立方之和等于该数。例如,因为 153-=1+5+3,所以 153 为水仙花数。
4.0 只三位数
#include<stdio.h>
int main() {
const int s = 1000;
int a[1000] = { 0 };
int i;
for (i = 0; i < s; i++) {
a[i] = 0;
}
i = 100;
for (i = 100; i < s; i++) {
int ge = i % 10;
int bai = i / 100;
int shi = (i / 10) % 10;
int hehe = ge * ge * ge + shi * shi * shi + bai * bai * bai;
if (hehe == i) {
a[i] = 1;
printf("%d\t", i);
}
}
printf("\n");
return 0;
}
4.1 更全的-运行超时
#include <stdio.h>
#include <math.h>
int main() {
int n;
scanf("%d",&n);
int i;
int c=n;
for( i=1;c>0;i*=10){
--c;
}
//printf("%d\n",i);
int t;
int he=0;
int b;
for (t =i/10; t < i; t++) {
b=t;
while(b!=0){
int x=b%10;
he+=pow(x,n);
b/=10;
}
if(he==t){
printf("%d\n",t);
}
he=0;
}
return 0;
}
4.2 不超时
#include <stdio.h>
int main() {
int a;
scanf("%d",&a);
//a=3;
int x=1;int y=1;
int i;
for(i=1;i<=a;i++)x*=10;
for(i=1;i<=a-1;i++)y*=10;
//printf("%d %d\n",x,y);
for(i=y;i<x;i++){
int da=i;
int tt=0;
while(da>0){
int m=a;
int t=1;
while(m>0){
t*=(da%10);
m--;
}
tt+=t;
da/=10;
}
if(tt==i)printf("%d\n",tt);
}
return 0;
}
5.输入百分制成绩,并把它转换成五级分制,转换公式为:A(优秀)90~100,B(良好)80~89,C(中等)70~79,D(合格)60~69
#include<stdio.h>
int main() {
int a; int grade;
scanf_s("%d", &a);
int b = a / 10;
switch (b) {
case 10:grade = 'A'; break;
case 9:grade = 'A'; break;
case 8:grade = 'B'; break;
case 7:grade = 'C'; break;
case 6:grade = 'D'; break;
default:grade = 'E';
}
printf("%c\n", grade);
return 0;
}
6.斐波拉契数列递归实现的方法如下
int Funct(int n)
{ if(n==0)return 1;
if(n==1)return 1;
retrurn Funct(n-1)+ Funct(n-2) }
请问,如何不使用递归,来实现上述函数?
#include<stdio.h>
void fibona(int i){
int a=0;
int b=1;
if(i>=1){
printf("%d ",a);
}if(i>=2){
printf("%d ",b);
}
int t;
for(t=3;t<=i;t++){
a=a+b;
printf("%d ",a);
t++;
b=a+b;
printf("%d ",b);
}
}
int main(){
int i;
scanf("%d",&i);
fibona(i);
return 0;
}
7.编写一个程序,将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为 1,4,5,6,8。
#include <stdio.h>
int main(int argc, char* argv[]) {
int a[] = { 8,6,5,4,1 };
int i;
for (i = 0; i < 2; i++) {
a[i] = a[4 - i] + a[i];
a[4 - i] = a[i] - a[4 - i];
a[i] = a[i] - a[4 - i];
}
for (i = 0; i < 5; i++) {
printf("a[%d]=%d\t", i, a[i]);
}
return 0;
}
8.编写一个程序根据输入的三角形的三条边判断是否能组成三角形,如果可以则输出它的面积和三角形类型(等边、等腰、直角三角形)。
#include<stdio.h>
#include<math.h>
int main() {
int a, b, c;
double t;
double q1;
double s;
int neng=0, lei=0;
scanf_s("%d %d %d", &a, &b, &c);
int max, min, mi;
int h;
h = a + b + c;
h /= 2;//边长的1/2一定会大于最长的一条边
int hh;
hh = a * a + b * b + c * c;
hh /= 2;//勾股定理,边长的平方和等于最长一条边的平方和
if (h > a && h > b && h > c) {
neng = 1;
if (a == b == c) {
lei = 3;
}
else if (a == b || a == c || b == c) {
if (hh == a * a || hh == b * b || hh == c * c) {
lei = 5;
}
else {
lei = 2;
}
}
else {
if (hh == a * a || hh == b * b || hh == c * c) {
lei = 4;
}
else {
lei = 1;
}
}
}
else { neng = 0; }
if (neng == 1) {//救命,千万不能忘了是==,气死我了
printf("能组成三角形\n");
switch (lei) {
case 1:printf("是普通三角形\n");
break;
case 2:printf("是等腰三角形\n");
break;
case 3:printf("是等边三角形\n");
break;
case 4:printf("是直角三角形\n");
break;
case 5:printf("是等腰直角三角形\n");
break;
}
t = 0.5 * (a + b + c);
q1 = t * (t - a) * (t - b) * (t - c);
s = sqrt(q1);
printf("边长%d,%d,%d的三角形面积是%.3f\n", a, b, c, s);
}
else {
printf("不能组成三角形\n");
}
return 0;
}
9.从键盘输入若干个学生成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入。
9.1 能跑 有危险
#include<stdio.h>
int maxmin(int a[], int s, int* max, int* min);
//数组作为函数参数,要用另一个数传入数组大小
int main() {
const int s = 100;
int a[100] = { 0 };
int i, t;
int la = 0; int nu = 0;
int max = 0;
int min = 0;
for (i = 0; i < s; i++) {
scanf_s("%d", &la);
if (la >= 0) {
nu++;
a[i] = la;
//这里不能再加一个输入循环!如果加了,输入一个数字,不做运算,
// 跳出IF,又输入,就会每次少一个数子记入数组
}
else {
break;
}
}
{
for (i = 0; i < s; i++) {
printf("A[%d]=%d\t", i, a[i]);
if ((i + 1) % 10 == 0) {
printf("\n");
}
}
}
maxmin(a, s, &max, &min);
printf("%d个学生,最高成绩为%d,最低成绩为%d", nu, max, min);
return 0;
}
int maxmin(int a[], int s, int* max, int* min) {
*max = *min = a[0];
int i = 0;
for (i = 0; i < s; i++) {
if (*max < a[i]) {
*max = a[i];
}
if (*min > a[i]) {
*min = a[i];
}
}
}
9.2 好像没啥问题的
#include<stdio.h>
/*从键盘输入若干个学生成绩,统计并输出最高成绩和最低成绩,当输入负数时结束输入*/
void dmax(int *max,int n);
void dmin(int *min,int n);
int main() {
int la = 0; int nu = 0;int ct=0;
int max = 0;
int min = 0;
int again=1;
scanf("%d",&la);
if(la<0){
again=0;
}else if(la>=0){
nu++;
max=min=la;
}
while(again==1){
scanf("%d",&la);
if(la>=0){
nu++;
dmax(&max,la);
dmin(&min,la);
}else if(la<0){
again=0;
}
}
printf("%d个学生,最高成绩为%d,最低成绩为%d", nu, max, min);
return 0;
}
void dmax(int *max,int n){
if(*max<=n){
*max=n;
}
}
void dmin(int *min,int n){
if(*min>=n){
*min=n;
}
}
10.编写函数将化氏温度转换为摄氏温度,公式为C=(F-32)*5/9;并在主函数中调用。
#include<stdio.h>
int C(int f,int*cent);
int main(void){
int cent;
int fahr;
scanf("%d",&fahr);
C(fahr,¢);
printf("华氏温度%d度转为摄氏温度是%d度",fahr,cent);
return 0;
}
int C(int f,int*cent){
*cent=(f-32)*5/9;
}
11.输入一个自然数,输出其各因子的连乘形式,如输入 12,则输出 12=1*2*2*3。
11.1 用了数组,有危险【救命时隔多日我已经看不懂自己写的代码了,请一定好好命名】
#include <stdio.h>
int main(int argc, char* argv[]) {
int i;
int t = 1;
int a[50] = { 0 };
int aa = 0;
scanf_s("%d", &i);
int ii = i;
for (t = 1; t <= i; t++) {
if (i % t == 0) {
i /= t;
a[aa] = t;
aa++;
t = 2;
}
}
printf("%d=", ii);
for (t = 0; t < 50; t++) {
if (a[t] != 0) {
printf("%d", a[t]);
if (t == aa-1) {
printf("\n");
break;
}
else {
printf("*");
}
}
}
return 0;
}
0.2 没毛病
#include <stdio.h>
#include <math.h>
/*11.输入一个自然数,输出其各因子的连乘形式,如输入 12,则输出 12=1*2*2*3。 */
void fuc(int a) {
printf("%d=1*",a);
for (int i = 2; i <= a; i++) {
if (a % i == 0) {
printf("%d", i);
a /= i;
i--;
if (a != 1) {
printf("*");
}
else {
break;
}
}
}
}
int main(int argc, char* argv[]) {
int val;
scanf_s("%d", &val);
fuc(val);
return 0;
}
12.N个整数从小到大排列,输入一个新数插入其中,使 N+1 个整数仍然有序。
0.1 数组,先排序
#include<stdio.h>
int main() {
int a[10] = { 2,34,65,78,90,119,200,278,890, };
int t;
int i ;
for (i = 0; i < 9; i++) {
printf("%d ", a[i]);
}
printf("\n");
scanf_s("%d", &t);
int temp=0;
int temp1=t;
if (a[8] < t) {
a[9] = t;
}
else {
for (i = 0; i < 9; i++) {
if (a[i] > t) {
temp = a[i];
a[i] = t;
int y;
for (y = i + 1; y <= 9; y++) {
temp1 = a[y];
a[y] = temp;
temp = temp1;
}
break;
}
}
}
for (i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
0.2 数组,先插入
#include<stdio.h>
#include<stdlib.h>
int main() {
int a[10] = { 2,34,65,78,90,119,200,278,890, 0};
int b;
scanf_s("%d", &b);
a[9] = b;
printf("befor\n");
for (int i = 0; i < 10; i++) {
printf("%d ", a[i]);
}
printf("\nafter\n");
for (int i = 0; i < 10; i++) {
for (int t = 0; t < 9; t++) {
if (a[t] > a[t + 1]) {
a[t] += a[t + 1];
a[t + 1] = a[t] - a[t + 1];
a[t] -= a[t + 1];
}
}
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
13.在 100~200 之间找出满足用3除余2,用5除余3和用7除余2的所有整数
#include<stdio.h>
int main() {
// /3--2,/5--3,/7--2
const int s = 201;
int a[201] = { 0 };
int i;
for (i = 0; i < s; i++) {
a[i] = 0;
}
i = 99;
for (i = 99; i < s; i++) {
if (i % 3 == 2) {
a[i] += 3;
}
if (i % 5 == 3) {
a[i] += 5;
}
if (i % 7 == 2) {
a[i] += 7;
}
}
int t = 99;
for (t = 99; t < s; t++) {
if (a[t] ==15) {
printf("%d ", t);
}
}
printf("\n");
return 0;
}
14.输入 10 个同学的成绩,统计 80 分以上和不及格的人数,并输出平均值
0.1 用了数组
#include<stdio.h>
int main() {
const int ren = 10;
int a[10] = { 0 };
printf("输入10个人的成绩\n");
int i;
for (i = 0; i < ren; i++) {
scanf_s("%d", &a[i]);
}
int t80 = 0, t60 = 0;
i = 0;
int sum=0; int average;
for (i = 0; i < ren; i++) {
sum += a[i];
if (a[i] >= 80) {
t80++;
}
if (a[i] < 60) {
t60++;
}
}
average = sum / ren;
printf("80分以上的有%d人,不及格的有%d人,平均分是%d", t80, t60,average);
return 0;
}
用空格会,可以一直输入,直到RNTER,只取前十个,结果正确
0.2 不用数组
#include<stdio.h>
#include<stdlib.h>
/*
14.输入 10 个同学的成绩,统计 80 分以上和不及格的人数,并输出平均值
*/
int main() {
int score; int sum = 0; int sc60 = 0; int sc80 = 0;
double meanValue;
for (int i = 0; i < 10; i++) {
scanf_s("%d", &score);
sum += score;
if (score >= 80) {
sc80++;
}
else if (score < 60) {
sc60++;
}
}
meanValue = sum / 10.0;
printf("80+:%d\tfail:%d\tmeanValue:%.1f\n", sc80, sc60, meanValue);
return 0;
}
15.编写一个函数来检验输入的一个字符是大写字母还是小写字母或不是 26 个英文字母。
#include <stdio.h>
int main(int argc, char *argv[]) {
int da;
int dada=0;
scanf("%c",&da);
if(da>='a'&&da<='z')
dada=1;
else if(da>='A'&&da<='Z')
dada=2;
switch (dada){
case 0:printf("不是字母");break;
case 1:printf("小写字母");break;
case 2:printf("大写字母");break;
}
return 0;
}
16.编写一个程序,从键盘输入半径和高,输出圆柱体的底面积和体积。
#include<stdio.h>
#define PI 3.14159
int main() {
int r;
int h;
double s, v;
scanf_s("%d %d",&r,&h);
s = 0.5 * PI * r * r;
v = s * h;
printf("s=%.2f v=%.2f\n", s, v);
return 0;
}
17.输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
#include <stdio.h>//一行字符,英文字母,空格,数字,其他
int main(int argc, char *argv[]) {
int c;
int cnum,cen,cc,cda;
cnum=cen=cc=cda=0;
while((c=getchar())!='\n'){
if(c>='0'&&c<='9')
cnum++;
else if(c>='a'&&c<='z'||c>='A'&&c<='Z')
cen++;
else if(c==' ')
cc++;
else cda++;
}
printf("英文字母%d,空格%d,数字%d,其他%d\n",cen,cc,cnum,cda);
return 0;
}
18.编写程序,形成如下矩阵,并输出。A=[ 11111 21111 32111 43211 54321 ]
#include<stdio.h>
int main() {
int A[5][5];
int i=0;
int t=0;
for(i=0;i<5;i++){
for(t=0;t<5;t++){
if(i-t>=0){
A[i][t]=i-t+1;
}else{
A[i][t]=1;
}
printf("A[%d][%d]=%d\t",i,t,A[i][t]);
}
printf("\n");
}
return 0;
}
19.用递归函数完成以下运算:sum(n)=12+22+…+n2
函数的原型如下:long sum(int n);
该函数完成 12+22+…+n2 的运算,并返回运算结果,其中 n>0。提示:你可以使用递归表达式:sum(n)=sum(n-1)+n2
#include<stdio.h>
int longsum(int i){
if(i==1){
printf("%d ",10*i+2);
return 12;
}else{
printf("%d ",10*i+2);
return longsum(i-1)+10*i+2;
}
}
int main(){
int i;
scanf("%d",&i);
int sum=longsum(i);
printf("\n");
printf("%d\n",sum);
return 0;
}
20.编写一个程序,将整数转换成字符串:void itoa(int,char);
#include<stdio.h>
#include<stdbool.h>
/*20.编写一个程序,将整数转换成字符串:void itoa(int,char);*/
//把数字-12345转成字符串“-12345”的意思
void myitoa(int num, char str[]) {
printf("number:%d\t", num);
int i = 0;
int isNegetive = 0;
if (num < 0) {
isNegetive = 1;
num = -num;
}
do {
str[i++] = num % 10 + '0';
num /= 10;
} while (num > 0);
if (isNegetive == 1) {
str[i++] = '-';
}
for (int t = 0; t < i / 2; t++) {
char temp = str[t];
str[t] = str[i-t - 1];//i-t-1
str[i - t - 1] = temp;
}
str[i] = '\0';
printf("string:%s\n", str);
}
int main() {
char str[20];
int num = -12345;
myitoa(num, str);
return 0;
}
21.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
#include<stdio.h>
typedef struct date {
int year;
int mouth;
int day;
int hour;
int min;
int sed;
}Date;
void dss(int year, int* pmou, int* pdays);
int main(){
Date i;
printf("请输入时间:(年 月 日 时 分 秒)");
scanf_s("%d %d %d %d %d %d", &i.year, &i.mouth, &i.day, &i.hour, &i.min, &i.sed);
Date y=i;
int mou = 0; int dday = 0;
int* pm = &mou; int* pd = &dday;
if (i.sed != 59) {
y.sed += 1;
}
else {
if (i.min != 59) {
y.sed = 0; y.min += 1;
}
else {
if (i.hour != 23) {
y.sed = 0; y.min = 0; y.hour += 1;
}
else {
y.sed = 0; y.min = 0; y.hour =0;
}
}
}
if (y.hour == y.min == y.sed == 0) {
mou = y.mouth;
dss(y.year, pm, pd);
//printf("%d %d\n", mou, dday);
if (y.day < dday) {
y.day += 1;
}
else {
if (y.mouth != 12) {
y.day = 1; y.mouth += 1;
}
else {
y.day = 1; y.mouth = 1; y.year += 1;
}
}
}
printf("下一秒是%d年%d月%d日%d时%d分%d秒\n", y.year, y.mouth, y.day, y.hour, y.min, y.sed);
return 0;
}
void dss(int year, int* pm, int* pd) {
int DAY[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
DAY[1] = 29;
}
int i = 0;
for (i = 0; i < 12; i++) {
if (*pm == i + 1) {
*pd = DAY[i];
}
}
}
22.编写一个程序,交换两个数,不用第三块儿内存。
#include<stdio.h>
int main(){
int a;int b;
scanf("%d %d",&a,&b);
a=a+b;
b=a-b;
a=a-b;
printf("%d %d\n",a,b);
return 0;
}
23.有一段文本,统计其中的单词数。例如:As a technology ,"HailStorm"is so new that it is still only known byits code name.注意:单词间的间隔不一定是一个空格
#include <stdio.h>//统计单词
#define OUT 0
#define IN 1
int main(int argc, char *argv[]) {
int c;
int cnt=0;int cnum=0;
int taste=OUT;
while((c=getchar())!=EOF){
if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c=='\''){
taste=IN;
cnt++;
if(cnt==1)
cnum++;
}else{
taste=OUT;
cnt=0;
}
}
printf("单词数%d\n",cnum);
return 0;
}
24.国际象棋有8x8格,每个格子可放一个棋子。皇后的规则是可以横、竖、斜移动。在一个棋盘放置8个皇后,并使它们互相无法威胁到彼此。
0.1 三个数组
#include<stdio.h>
#include<stdbool.h>
/*24.国际象棋有8x8格,每个格子可放一个棋子。皇后的规则是可以横、竖、斜移动。
在一个棋盘放置8个皇后,并使它们互相无法威胁到彼此。*/
//好好好,用递归穷举是吧
int a[8] = { 0 };//第I行的皇后放在第几列
bool zong[8] = { 1,1,1,1,1,1,1,1 };//列的状态,1可以占领
bool d1[15] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, };//对角线d1[t],a[i]+i=t;1可以占领
bool d2[15] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, };//对角线d2[t],a[i]-i+7=t;1可以占领
int num = 0;
void print() {
printf("num=%d\n",num);
for (int i = 0; i < 8; i++) {
printf("%d", a[i]);
}
printf("\n");
}
void queen(int n) {//第N行的皇后
for (int i = 0; i < 8; i++) {//第N行的皇后放第I列,一行八种可能
if (zong[i] && d1[n + i] && d2[n - i + 7]) {//占位,更改占位的列,对角线状态,都满足,占位
a[n] = i;
zong[i] = false;
d1[n + i] = false;
d2[n - i + 7] = false;//占位
if (n < 7) {
queen(n +1);//摆放下一行的皇后
}
else { //n=7七行完成
num++;
print();
}
zong[i] = true;//回溯,考虑其他可行方案,1行1列+2行1列一种,回溯,1行1列+2行3列一种……
d1[n + i] = true;
d2[n - i + 7] = true;
}
}
}
int main() {
queen(0);
return 0;
}
0.2 一个数组?妈的为什么不对妈的妈的妈的
#include<stdio.h>
#include<stdbool.h>
/*24.国际象棋有8x8格,每个格子可放一个棋子。皇后的规则是可以横、竖、斜移动。
在一个棋盘放置8个皇后,并使它们互相无法威胁到彼此。*/
//好好好,用递归穷举是吧
//对角线1: a[i]+i=t
//对角线2: a[i]-i+7=t
int a[8] = { 0 };//第I行的皇后放在第几列
int num = 1;
void print() {
printf("num=%d\n", num);
for (int i = 0; i < 8; i++) {
printf("%d", a[i]);
}
printf("\n");
}
bool check(int n, int i) {//n,行,i,列
for (int t = 0; t < n; t++) {//遍历查看N行之前,有没有在同一列,对角线上
if (a[t] != i && a[t] + t != n + i && t - a[t] != n - i) {
return true;
}
else {
return false;
}
}
}
void queen(int row) {//第N行的皇后
if (row == 9) {
num++;
print();
return;
}
for (int i = 0; i < 8; i++) {
if (check(row, i)) {
a[row] = i;//放置
queen(row + 1);//下一行
a[row] = 0;//回溯
}
}
}
int main() {
queen(0);
printf("%d\n",num);
return 0;
}
25.有一字符串 a,内容为:My name is li jilin.,另有字符串 b,内容为:Mr. Zhang Haoling is very happy.写一函数,将字符串 b中从第5个到第 17个字符复制到字符串a中,取代字符串a中第 12 个字符以后的字符。输出新的字符串。
0.1 FOR循环,呵呵呵可能我就是笨只会用最基础得吧
#include<stdio.h>
#include<string.h>
/*
有一字符串 a,内容为:My name is li jilin.,
另有字符串 b,内容为:Mr. Zhang Haoling is very happy.
写一函数,将字符串 b 中从第5个到第 17个字符复制到字符串 a 中,
取代字符串 a 中第 12 个字符以后的字符。输出新的字符串。
*/
void replaceSubstring(char* a, char* b) {
char c[26]; int i;
for (i = 0; i < 12; i++) {
c[i] = a[i];
}
for (int t = 5; t < 18; t++) {
c[i++] = b[t];
}
c[i] = '\0';
printf("after: %s\n", a);
}
int main() {
char a[] = "My name is li jilin.";
char b[] = "Mr. Zhang Haoling is very happy.";
replaceSubstring(a, b);
return 0;
}
26.有一分数序列:1/2,1/4,1/6,1/8….,用函数调用的方法,求此数列前 20项的和。
#include<stdio.h>
void heh(int n);
int main() {
int n = 20;
heh(n);
return 0;
}
void heh(int n) {
int i = 1;
double sum = 0.0;
for (i = 1; i <= n; i++) {
sum += 0.5/ i;
}
printf("%f\n", sum);
}
27.已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。
#define _CRT_STRUCT_NO_WARNING
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
/*27.已知一个单向链表的头,请写出删除其某一个结点的算法,要求,先找到此结点,然后删除。*/
typedef struct LinkNode {
int data;
struct LinkNode* next;
}LinkN;
LinkN* gethead() {
LinkN* header = malloc(sizeof(LinkN));
header->data = -1;
header->next = NULL;
LinkN* pCurrent = header;
printf("please enter value\n");
int val;
while (true) {
scanf_s("%d", &val);
if (val == -1) {
break;
}
LinkN* newnode = malloc(sizeof(LinkN));
newnode->data = val;//赋值新结点
newnode->next = NULL;
pCurrent->next = newnode;
pCurrent = newnode;
}
return header;
}
void print(LinkN* header) {
if (header->next == NULL) {
return;
}
LinkN* pCurrent = header->next;
while (pCurrent->next!=NULL) {
printf("%d ", pCurrent->data);
pCurrent = pCurrent->next;
}
printf("%d\n", pCurrent->data);
}
void delnode(LinkN* header,int val) {
printf("delete %d after:\n", val);
if (header->next == NULL) {
return;
}
LinkN* pCurrent = header->next;
LinkN* pPrev = header;
while (pCurrent->next != NULL) {
if (pCurrent->data == val)
break;
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
if (pCurrent->next == NULL) {
printf("no find\n");
return;
}
pPrev->next = pCurrent->next;
free(pCurrent);
pCurrent = NULL;
}
void test() {
LinkN *header=gethead();
print(header);
delnode(header, 45);
print(header);
}
int main() {
test();
return 0;
}
28.用冒泡法对 10 个整数排序。
#include <stdio.h>
int main(){
int a[9] = { 4,2,8,0,5,7,1,3,9 };
for (int i = 0; i < 9-1; i++){
for (int j = 0; j < 9 - i - 1; j++){
if (a[j] > a[j + 1]){
a[j] += a[j + 1];
a[j + 1] = a[j] - a[j + 1];
a[j] -= a[j + 1];
}
}
}
for (int t = 0; t < 9; t++)
printf("a[%d]=%d\n",t,a[t]);
return 0;
}
29.有一个 16 位的整数,每4位为一个数,写函数求他们的和。比如:整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制为 36)
#include<stdio.h>
//29.有一个 16 位的整数,每4位为一个数,写函数求他们的和。
//比如:整数 1101010110110111(十进制为 54711),和 1101+0101+1011+0111(十进制为 36)
int longsum(int i){
int sum=0;
int t=0;
int p;
for(t=0;t<4;t++){
sum+=i%16;
i/=16;
}
return sum;
}
int main(){
int i;
scanf("%d",&i);
printf("%0x\n",i);
printf("%d\n",longsum(i));
return 0;
}
30,设编号为 1,2,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1 开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
#define _CRT_STRUCT_NO_WARNING
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
/*30.设编号为 1,2,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1 开始报数,
数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,
依次类推,直到所有人出列为止,由此产生一个出队编号的序列。*/
typedef struct LinkNode {
int data;
struct LinkNode* next;
}LinkN;
LinkN* gettail(LinkN *header,int n) {
LinkN* pCurrent = header;//pCurrent指针,丢,给我改晕了
int val=1;
while (val<=n-1) {
LinkN* newnode = malloc(sizeof(LinkN));
newnode->data = ++val;//赋值新结点
newnode->next = NULL;
pCurrent->next = newnode;//第一次改变了HEADER的NEXT
pCurrent = newnode;
}
pCurrent->next = header;//圆形链表
return pCurrent;
}
void print(LinkN* tail,int n) {
if (tail->next == NULL) {
return;
}
LinkN* pCurrent = tail->next;
for (int i = 0; i < n; i++) {
printf("%d ", pCurrent->data);
pCurrent = pCurrent->next;
}
printf("\n");
}
void baoshu(LinkN* header, LinkN* tail, int n,int k,int m) {
printf("after:\n");
if (header->next == NULL) {
return;
}
LinkN* pPrev = tail;
LinkN* pCurrent = header;
for (int i = 0; i < k; i++) {
pPrev = pCurrent;
pCurrent = pCurrent->next;
}
int cnt = 1;
int index = n;
while (index>1) {
if (cnt == m) {
printf("%d ", pCurrent->data);
pPrev ->next= pCurrent->next;//注意哦!!!!!PREV不变,PREV的NEXT变了
free(pCurrent);
pCurrent = pPrev->next;
cnt = 1;
index--;
}
else {
pPrev = pCurrent;
pCurrent = pCurrent->next;
cnt++;
}
}
printf("%d ", pCurrent->data);
}
void test() {
int n,k,m;
printf("input number:\n");
scanf_s("%d %d %d",&n, &k,&m);
LinkN* header = malloc(sizeof(LinkN));//header是指针
header->data = 1;
header->next = NULL;
LinkN* tail = gettail(header,n);//头结点指向的东西变了,DATA,NEXT
print(tail,n);
baoshu(header, tail,n,k,m);
}
int main() {
test();
return 0;
}