大数相加:
#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;
}