您的当前位置:首页正文

7-4 Have Fun with Numbers (10 分),大数相加,三角函数,分式相加,*电文环形加密,动态分配

2024-12-02 来源:个人技术集锦

大数相加:

#include <stdio.h>
#include <string.h>
int n1[1000];
int n2[1000];
int n3[1000];
void dashu(char *a,char *b){
//先把字符数组转化为数字数组
	int i,j;
	int len1=strlen(a);
	int len2=strlen(b);
	for(i=len1-1;i>=0;i--){
		n1[len1-i-1]=a[i]-'0';//倒着输入方便后面相同位数相加
	}
	for(i=len2-1;i>=0;i--){
		n2[len2-i-1]=b[i]-'0';
	}
	int len;
	if(len1>len2){
		len=len1;
	}
	else{
		len=len2;
	}
\\开始相加;
	for(i=len-1;i>=0;i--){
		n3[i]=n1[i]+n2[i]+n3[i];\\加上n3[i]把进位的数字加上
		if(n3[i]>9){\\进位操作
			n3[i]=n3[i]%10;
			n3[i+1]++;
		}
	}
	if(n3[len]!=0){\\最大的一位如果有进位也一定是1;单独输出
		printf("%d",n3[len]);
	}
	for(i=len-1;i>=0;i--){
		printf("%d",n3[i]);
	}
}
int main(){
	char a[1000],b[1000];
	gets(a);
	gets(b);
	dashu(a,b);
 return 0;
} 

三角函数:

sin:(以sin为例)

1.sin传进去的值只能是double型的;

2.返回值也是double;

3.并且你传进去的值不是角度而是弧度;所以要先角度*(pi/180)转为弧度;

4.asin弧度的范围为【-pi/2,pi/2】;

#include<stdio.h>
#include<math.h>
#define PI 3.1415926535897932384626
int main()
{
    double v, x;
    scanf("%lf%lf", &v, &x);
    double ret = (x * 9.8) / (v * v);\\由物理知识得
    double a = asin(ret);
    a = a / 2.0;\\
    a = a * (180.0 / PI);\\转为角度
    a = 90 - a;\\为啥要90-a?因为asin的取值范围,带个射角为60就明白了;
    int du = (int)a;
    int minute = (int)((a - du) * 60);
    double second = ((a - du) * 60 - minute) * 60;
    printf("%d %d %.2lf", du, minute, second);
    return 0;
}

*电文环形加密:

直接看题吧:

 

//#include <stdio.h>
//#include <string.h>//测试点有问题
char a[1000010];
int main(){
        int n,i;
    scanf("%d\n",&n);
    gets(a);
    n=n%26;//非常重要,必须取余,原因我也不晓得;
    int len=strlen(a);
    for(i=0;i<len;i++){
        if(a[i]>='a'&&a[i]<='z'){
            if(n>=0){
              a[i]=((a[i]-'a')+n)%26+'a';
            }
            else if(n<0){
                a[i]=((a[i]-'a')+n+26)%26+'a';
            }
        }
        if(a[i]>='A'&&a[i]<='Z'){
           if(n>=0){
              a[i]=((a[i]-'A')+n)%26+'A';
            }
            else if(n<0){
                a[i]=((a[i]-'A')+n+26)%26+'A';
            }
        }
    }
    puts(a);
    return 0;
}

 动态分配:

这类题型还是做得太少,自己以后要是再遇到就在补上。

 这题就是青蛙上楼梯的plus版本

 这篇博客里有,我就不讲了直接上代码理解是;

#include <stdio.h>
int a[1000010];
#define l 998244353
int main(){
	int n,k,i;
	while(scanf("%d %d",&n,&k)!=EOF){
	if(k==1){
		a[1]=0;
		a[2]=1;
		a[3]=2;
	}
	else if(k==2){
		a[1]=1;
		a[2]=0;
		a[3]=2;
	}
	else if(k==3){
		a[1]=1;
		a[2]=2;
		a[3]=0;
	}
	else if(k>3){
		a[1]=1;
		a[2]=2;
		a[3]=4;
		a[k]=0;//相当于把ak减去了;
	}
	for(i=4;i<=n;i++){
		if(i!=k)a[i]=(a[i-1]+a[i-2]+a[i-3])%l;//题目要求除以l、当i==k时我不加他那磨就不会对ak赋值;
	}
	printf("%d\n",a[n]);
}
	return 0;
} 

分式相加:

直接看题

#include<stdio.h>
int common(int a,int b);
int main(){
    int i,a,b,a1,b1,n;
    int v,t,x;
    scanf("%d",&n);
        scanf("%d/%d",&a,&b);
    for(i=1;i<n;i++){
    	scanf("%d/%d",&a1,&b1);
    	a=a*b1+b*a1;//把分子都同分相加;
    	b=b*b1;
    	v=common(a,b);
    	a=a/v;//除与最大公约数化为最简式
    	b=b/v;//
	}
    if(b==1) printf("%d",a);//三种情况
    
    else if(a>b){//
    	t=a%b;
    	x=a/b;
    	if(t==0) printf("%d",x);
    	else printf("%d %d/%d",x,t,b);
	}
	else printf("%d/%d",a,b);
	return 0;
}
int common(int a,int b){//ÕÒµ½·Ö×Ó·ÖĸµÄ×î´ó¹«Ô¼Êý 
	int t;
	while(b!=0){
		t=a%b;
		a=b;
		b=t;
	}
	return a;
}

显示全文