C语言——课程实验报告

任务一:

将 1,2,…,9 共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。
输入格式

输出格式
若干行,每行3个数字。按照每行第1个数字升序排列。
输入

输出
192 384 576

(每行***表示一个答案)

#include <stdio.h>
int main()
{
	int a, b, c;
	int i, j, s[9];
	for (a = 100; a < 333; a++)
	{
		b = 2 * a, c = 3 * a;
		s[0] = a / 100; s[1] = a % 100 / 10; s[2] = a % 10;
		s[3] = b / 100; s[4] = b % 100 / 10; s[5] = b % 10;
		s[6] = c / 100; s[7] = c % 100 / 10; s[8] = c % 10;
		for (i = 0; i < 8; i++)
		{
			for (j = i + 1; j < 9; j++)
				if (s[i] == s[j]||s[i]==0||s[j]==0)break;
			if (j < 9) break;
		}
		if (i == 8 && j == 9)
			printf("%d %d %d\n", a, b, c);
	}
	return 0;
}

任务二:

自然数序列为:1 2 3 4 5 6 7 8 9 …
自然数的2次方序列为:1 4 9 16 25 36 49…
自然数的3次方序列为:1 8 27 64 125 …
自然数的4次方序列为:1 16 81 256 …

我们可以将这些数称为次方数。请编写程序找到1至10000中所有的次方数,每5个一行由小到大打印出来,并且统计次方数个数。
输入格式
无需输入
输出格式
所有次方数和其总个数
输出样例
1 4 8 9 16
25 27 32 36 49
64 81 100 121 125
128 144 169 196 216


一共XXX个数

#include<stdio.h>
#include<math.h>
main()
{
	int flag;
	int i, j, m, a[10000], k = 0;
	for( m = 1;m <= 10000; m++)
	for( i = 1;i <= 100; i++){
		flag = 0;
	for( j = 2;j <= 100; j++)
	if( pow(i,j) == m){
		a[k++] = m; flag = 1; break;
	}
	if(flag==1) break;
	}
	for( j=0; a[j] != '\0'; j++){
		printf("%d\t", a[j]);
		if( (j+1)%5 == 0) printf("\n");
	}
	printf("\n一共%d个数",j);
}

任务三:

输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度。(连号指从小到大连续自然数)
输入格式
第一行,一个数n;
第二行,n个正整数,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入样例
10
3 5 6 2 3 4 5 6 8 9
输出样例
5

#include <stdio.h>
int main()
{
    int n,x0,x1,cnt,max;
    scanf("%d",&n);
    cnt=0,max=0,x0=0;
    while (n--)
    {
       scanf("%d",&x1);
       if (x1==x0+1)
          cnt++;
       else
        {
            if (cnt>max)  max=cnt;
            cnt=1;
        }
        x0=x1;
    }
    printf("%d\n",max);
       return 0;
}

任务四:

当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
该校验的过程:
1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
3、将奇数位总和加上偶数位总和,结果应该可以被10整除。
例如,卡号是:5432123456788881
则奇数位和=35
偶数位乘以2(有些要减去9)的结果:1 6 2 6 1 5 7 7,求和=35。
最后35+35=70 可以被10整除,认定校验通过。
请编写一个程序,从键盘输入卡号,然后判断是否校验通过。通过显示:“Right”,否则显示“Wrong”。
输入格式
一串信用卡号。
输出格式
判断结果。
输入样例
356827027232780
输出样例
Right

#include <stdio.h>
#include <string.h>
int main() {
    char card[20];
    int oddSum = 0, evenSum = 0, Sum = 0;
    printf("请输入信用卡号: ");
    scanf("%s", card);
    int i, j; 
    for(i = strlen(card) - 1, j = 1; i >= 0; i--, j++) {
        int digit = card[i] - '0';
        if (j % 2 != 0)
            oddSum += digit;
        else
            evenSum += (digit * 2 > 9) ? (digit * 2 - 9) : digit * 2;
    }
    Sum = oddSum + evenSum;
    if (Sum % 10 == 0) {
        printf("Right\n");
    } else {
        printf("Wrong\n");
    }
    return 0;
}

任务五:

通过键盘输入三个正整数N、X、Y,且X、Y均不大于N,那么在NN格的棋盘中,与第X行第Y列的格子处在同一行、同一列、同一对角线的格子的坐标分别是什么?假设输入的三个数为5 4 2,表示55棋盘中第4行第2列的格子,即坐标(4,2),此时对应的输出结果为:
(4,1) (4,3) (4,4) (4,5)
(1,2) (2,2) (3,2) (5,2)
(3,1) (5,3)
(5,1) (3,3) (2,4) (1,5)
输入格式
三个正整数
输出格式
四行结果,每一行均为坐标(同一行、同一列、同一主对角线、同一副对角线)
输入样例
3 1 2
输出样例
(1,1) (1,3)
(2,2) (3,2)
(2,3)
(2,1)

#include <stdio.h>
int main() {
    int N, X, Y;
    scanf("%d %d %d", &N, &X, &Y);
    int i, j;
    for (j = 1; j <= N; j++)
        if (j != Y)
            printf("(%d,%d) ", X, j);
    printf("\n");
    for (i = 1; i <= N; i++)
        if (i != X)
            printf("(%d,%d) ", i, Y);
    printf("\n");
    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
            if (i - j == X - Y && i!=X)
                printf("(%d,%d) ", i, j);
    printf("\n");
    for (i = 1; i <= N; i++)
        for (j = 1; j <= N; j++)
            if (i + j == X + Y && i!=X)
                printf("(%d,%d) ", i, j);
    return 0;
}

任务六:

编写一个程序,将自然数1~n2 按“蛇形”填入n×n矩阵中。例如,当n=5时,构造的方阵如下。
输入格式
一个整数n
输出格式
n×n的矩阵
输入样例
5
输出样例
1 3 4 10 11
2 5 9 12 19
6 8 13 18 20
7 14 17 21 24
15 16 22 23 25

#include <stdio.h>
#define  N  20
int main()
{
    int a[N][N];
    int n,i,j,k=1,m,p,q;
    scanf("%d",&n);
    m=1;
    for (k=1;k<2*n; k++)
    {
       if (k<n) q=k;
       else  q=2*n-k;
       for (p=1;p<=q;p++)
       {
           if (k%2) { i=p; j=q+1-p;}
           else  { i=q+1-p; j=p; }
           if (k>n) { i=i+n-q;  j=j+n-q; }
           a[i][j]=m++;
       }
    }
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=n;j++)
            printf("%4d",a[i][j]);
        printf("\n");
    }
    return 0;
}

任务七:

我们都知道:1+2+3+ … + 100 = 5050
现在要求你把其中两个不相邻的加号变成乘号,使得结果为5678
比如:
1+2+3+…+67+8+…+2526+27+…+100 = 5678就是符合要求的答案。
请你编写代码找到所有符合要求的答案,即式子中乘号前的两个数。
输入格式
无需输入
输出格式
每行分别输出符合要求的式子中乘号前的数字,以空格隔开。例如上面例子中应当输出6 25

#include<stdio.h>
main()
{
	int i, j, k, sum;
	for(i=1; i<101; i++)
	for(j=3; j<101; j++)
	{
		sum = i*(i+1)+j*(j+1);
		for(k = 1; k<i; k++)
		sum += k;
		for(k = i+2; k<j; k++)
		sum += k;
		for(k = j+2; k<101; k++)
		sum += k;
		if(sum == 5678 && i<j) printf("%d %d\n", i, j);
	}
}

任务八:

计算两个矩阵的乘法。n×m阶的矩阵A乘以m×k阶的矩阵B得到的矩阵C是n×k阶的,且C[i][j]=A[i][0]×B[0][j]+A[i][1]×B[1][j]+……A[i][m-1] ×B[m-1][j],其中C[i][j]表示C矩阵中第i行第j列元素。
输入格式
第一行为n,m,k,表示A矩阵是n行m列,B矩阵是m行k列,n,m,k均小于100。然后先后输入A和B两个矩阵,A矩阵n行m列,B矩阵m行k列,矩阵中每个元素的绝对值不会大于1000。
输出格式
输出矩阵C,一共n行,每行k个整数,保持矩阵元素整齐排列。
输入样例
3 2 3
7 8
9 10
11 12
13 14 15
16 17 18
输出样例
219 234 249
277 296 315
335 358 381

#include<stdio.h>
main(){
	int n, m, k, i, j, t;
	scanf("%d %d %d", &n, &m, &k);
	int A[n][m], B[m][k], C[n][k];
	for(i=0; i<n; i++)
	for(j=0; j<m; j++)
	scanf("%d", &A[i][j] );
	for(i=0; i<m; i++)
	for(j=0; j<k; j++)
	scanf("%d", &B[i][j] );
	for(i=0; i<n; i++)
	for(j=0; j<k; j++){
		C[i][j] = 0;
		for(t=0; t<m; t++)
		C[i][j] += A[i][t] * B[t][j];
	}
	for(i=0; i<n; i++){
		for(j=0; j<k; j++)
		printf("%d\t", C[i][j]); 
		printf("\n");
	} 
}

任务九:

给出一个由A和B组成的串(长度为1~80),统计得分。每个A的得分为目前连续出现A的个数,连续出现B仅计1分。比如,AABBBABAAA的得分为1+2+(1)+1+(1)+1+2+3,BAAA的得分为(1)+1+2+3,AABBBABB的得分为1+2+(1)+1+(1)。
输入格式
第一行,一个整数n
n行A和B构成的字符串
输出格式
n行整数,每个整数为对应字符串的得分
输入样例
3
AABBBABAAA
BAAA
AABBBABB
输出样例
12
7
6

#include<stdio.h>
#include<string.h>
main()
{
	int n;
	scanf("%d\n", &n);
	char s[n][80];
	int i, j, t, sumA, sumB;
	for(i=0; i<n; i++)
	gets(s[i]);
	for(i=0; i<n; i++)
	{
		sumA = 0; t = 0; sumB = 0; 
		for(j=0; j<strlen(s[i]); j++)
		if(s[i][j] == 'A') 
		{
			sumA += sumB;
			sumB = 0;
			t++;
			sumA += t;
		}
		else {
		t=0;sumB = 1;
		}
	if(s[i][--j] == 'B') sumA++;
	printf("%d\n", sumA);
	}
}

任务十:

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9再求和, 0×1+6×2+……+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。
输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。
输入样例
0-670-82162-0
输出样例
0-670-82162-4

#include <stdio.h>
int main()
{
    char isbn[14],ch;
    int i,k,s;
    scanf("%s",isbn);
    for (i=0,k=0,s=0;i<=10;i++)
        if (isbn[i]!='-')
        {
           k++;
           s+=k*(isbn[i]-'0');
        }
    if (s%11==10)  ch='X';
    else  ch=(s%11)+'0';
    if (isbn[12]==ch) printf("Right\n");
    else { isbn[12]=ch; printf("%s\n",isbn); }
    return 0;
}

任务十一:

假设:
S1 = 1
S2 = 12
S3 = 123
S4 = 1234
……
S9 = 123456789
S10 = 1234567891
S11 = 12345678912
……
S18 = 123456789123456789
S19 = 1234567891234567891
……
现在我们把所有的串连接起来
S = 1121231234……123456789123456789112345678912……
那么你能告诉我在S串中的第N个数字是多少吗?
输入格式
输入首先是一个数字T,代表有T次询问。
接下来的T行每行有一个整数N(1 <= N < 2^31)。
输出格式
对于每个N,输出S中第N个对应的数字。
输入样例
6
1
2
3
4
5
10
输出样例
1
1
2
1
2
4

#include <stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while (t--)
    {
        int n;
        scanf("%d",&n);
        int a=1;
        while (n>a)
        {
            n-=a;
            a++;
        }
        n=n%9;
        if(n==0) n=9;
        printf("%d\n",n);
    }
    return 0;
}

任务十二:

在平面坐标轴中,有四个点的坐标分别为(x,y)、(x1,y1)、(x2,y2)和(x3,y3)。请编写程序判断点(x,y)和由其它三个点构成三角形的位置。若三个点无法构成三角形,输出“Three points cannot form a triangle!”;点与三角形的位置关系有在三角形边上、三角形外部和三角内部三种,分别对应 “Point on the edge of the triangle.”、“The point is outside the triangle.”和“The point is inside the triangle.”的内容输出。(注意个坐标值均为浮点型数)
输入格式
8个值分别对应(x,y)、(x1,y1)、(x2,y2)和(x3,y3)坐标
输出格式
输出题目中要求的信息
输入样例
0.2 0.1 0.0 0.0 1.0 0.0 0.0 1.0
输出样例
The point is inside the triangle.
输入样例
2.0 0.0 0.0 0.0 1.0 0.0 0.0 1.0
输出样例
The point is outside the triangle.
输入样例
0.5 0.0 -1.0 0.0 1.0 0.0 0.0 2.0
输出样例
Point on the edge of the triangle.

#include <stdio.h>
#include <math.h>
#define EPSINON 0.00000001
double dis(double x1,double y1,double x2,double y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
double area(double a,double b,double c)
{
    double p=(a+b+c)/2;
    if(a+b>c&&a+c>b&&b+c>a)
        return sqrt(p*(p-a)*(p-b)*(p-c));
    else
        return 0;
}
int main()
{
    double d23,d13,d12,s,d01,d02,d03,s1,s2,s3;
    double x,y,x1,y1,x2,y2,x3,y3;
    scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x,&y,&x1,&y1,&x2,&y2,&x3,&y3);
    d12=dis(x1,y1,x2,y2);
    d13=dis(x1,y1,x3,y3);
    d23=dis(x2,y2,x3,y3);
    s=area(d12,d13,d23);
    if(s==0)
    {
        printf("Three points cannot form a triangle!");
        exit(-1);
    }
    d01=dis(x,y,x1,y1);
    d02=dis(x,y,x2,y2);
    d03=dis(x,y,x3,y3);

    s1=area(d01,d02,d12);
    s2=area(d23,d02,d03);
    s3=area(d01,d13,d03);

    if((s1<EPSINON||s2<EPSINON||s3<EPSINON)&&(s1+s2+s3-s)<EPSINON)
        printf("Point on the edge of the triangle.");
    else if((s1+s2+s3-s)>EPSINON)
        printf("The point is outside the triangle.");
    else
        printf("The point is inside the triangle.");

    return 0;
}

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值