

网上的算法:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[201],b[201];
int l,c[201],p=0;//初始化不能忘
while(cin>>a>>b)
{
l=max(strlen(a),strlen(b));
for(int i=0;i<=l;i++)
{
if(i<strlen(a))
p+=a[strlen(a)-i-1]-'0';
if(i<strlen(b))
p+=b[strlen(b)-i-1]-'0';
c[i]=p%10;
p=p/10;
}
int len=0;
for(len=l;c[len]==0&&len>0;len--);
for(;len>=0;len--)
cout<<c[len];
cout<<endl;
}
system("pause");
}
我的错误算法 我没有考虑到数组下标的问题 计算是从左往右 而正常运算是从右往左 待改进
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int flag=1;
while(flag){
int a[200],b[200],c[400];
int i,j=0;
for(i=0;i<200;i++)
a[i]=b[i]=-1;
for(i=0;i<400;i++)
c[i]=-1;
int flag2=1;
while(flag2){
char temp;
scanf("%c",&temp);
if(temp=='\n'){
flag2=0;
break;
}
a[j++]=int(temp)-48;
}
int flag3=1;j=0;
while(flag3){
char temp2;
scanf("%c",&temp2);
if(temp2=='\n'){
flag3=0;
break;
}
b[j++]=int(temp2)-48;
}
i=0;
int temp3;
while(a[i]!=-1 && b[i]!=-1){
if(i==0)
temp3=0;
int result=a[i]+b[i];
cout<<"result:"<<result<<endl;
result+=temp3;
cout<<"result+temp3:"<<result<<endl;
c[i]=result%10;
cout<<"c[i]:"<<a[i]<<endl;
temp3=result/10;
cout<<"temp3:"<<temp3<<endl;
i++;
}
int temppp=0;
if(a[i]!=-1){
while(a[i]!=-1){
temppp=a[i]+temp3;
c[i]=temppp%10;
temp3=temppp/10;
i++;
}
if(temp3!=0)
c[i]=temp3;
}
if(b[i]!=-1){
while(b[i]!=-1){
temppp=b[i]+temp3;
c[i]=temppp%10;
temp3=temppp/10;
i++;
}
if(temp3!=0)
c[i]=temp3;
}
i=0;
while(c[i]!=-1)
cout<<c[i++];
cout<<endl;
}
}


#include<stdio.h>
#include<string.h>
int main(){
char a[201],b[201],t[201];
int la,lb,c[201]={0},p=0,i;
while(~scanf("%s %s",a,b)){
la=strlen(a);lb=strlen(b);
for(i=0;i<201;++i)
c[i]=0;
//如果la<lb之后两个数互换 长度也互换
if(la<lb||(la==lb&&strcmp(a,b)<0)){
//printf("-");
strcpy(t,a);
strcpy(a,b);
strcpy(b,t);
la+=lb;
lb=la-lb;
la-=lb;
}
for(i=0;i<=la;i++){
if(i<=lb) c[i]=a[la-i]-b[lb-i]-p;
else c[i]=a[la-i]-'0'-p;
if(c[i]<0){
p=1;
c[i]+=10;
}
else p=0;
}
for(i=la;c[i]==0;i--);
if(i<1)printf("0");
for(;i>0;i--)printf("%d",c[i]);
printf("\n");
}
return 0;
}


#include <stdio.h>
int main(){
int a[100000],l,i,j,n;
while(~scanf("%d",&n)){
a[1]=1;
for(i=2;i<100000;i++)
a[i]=0;
l=2;
for(i=1;i<=n;i++){
for(j=1;j<l;j++)
a[j]*=i;
for(j=1;j<l;j++){
a[j+1]+=a[j]/10;
a[j]%=10;
}
for(;a[l];l++){
a[l+1]+=a[l]/10;
a[l]%=10;
}
}
for(i=l-1;i;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}


#include<stdio.h>
#include<string.h>
int main(){
char sa[102],sb[102];
int a[202],b[202],c[202];
int la,lb,lc,i,j,k;
while(~scanf("%s%s",sa,sb)){
la=strlen(sa);
lb=strlen(sb);
for(i=0;i<la;i++)
a[i]=sa[la-1-i]-'0';
for(i=0;i<lb;i++)
b[i]=sb[lb-1-i]-'0';
for(i=0;i<202;i++)
c[i]=0;
lc=la+lb-1;
for(i=0;i<la;i++){
for(j=0;j<lb;j++){
c[i+j]+=a[i]*b[j];
}
for(k=0;k<lc;k++){
c[k+1]+=c[k]/10;
c[k]%=10;
}
for(;c[lc];lc++){
c[lc+1]+=c[lc]/10;
c[lc]%=10;
}
}
for(lc--;lc>=0;lc--)
printf("%d",c[lc]);
printf("\n");
}
return 0;
}


#include<iostream>
#include<string>
#include<stdio.h>
using namespace std;
typedef struct LNode{
string name;
int id;
struct LNode *next;
}LNode,*LinkList;
int main(){
int N;
while(cin>>N){
LNode *Head;
Head=(LNode *)malloc(sizeof(LNode));
Head->next=NULL;
int i;
LNode *p=Head;
for(i=1;i<=N;i++){
LNode *Person=new LNode;
Person->id=i;
cin>>Person->name;
p->next=Person;
p=p->next;
}
p->next=Head->next;
int W,S;
scanf("%d,%d",&W,&S);
p=Head->next;
while(p->id!=W){
p=p->next;
}
int people_num=N;
LNode *prep;
string a[N];
int temp=0;
while(people_num!=1){
int i=1;
while(i<S){
p=p->next;
i++;
if(i==S-1)
prep=p;
}
//接下来删除节点 不单独弄个函数了
a[temp++]=p->name;
prep->next=p->next;
p=prep->next;
people_num--;
}
if(people_num==1)
a[temp]=p->name;
for(i=0;i<N;i++)
cout<<a[i]<<endl;
}
return 0;
}



补充 cin遇到空格 换行符 tab键会停止写入 写入的多余的内容会留在缓冲区 后续再需要cin或者getline的时候会把这部分多余的数据给先输入进去
所以为了避免换行符影响 使用getline的时候要优先把缓冲区不需要的东西拿走或者直接清空缓冲区
#include<iostream>
#include<string>
using namespace std;
void process(string content){
int i=content.length();
for(int j=0;j<i;j++){
if(int(content[j])>=65 && int(content[j])<=69){
content[j]=char(int(content[j])+21);
}
else if(int(content[j]>=70 &&int(content[j])<=90)){
content[j]=char(int(content[j])-5);
}
}
cout<<content<<endl;
}
int main(){
int flag=1;
string start;
string end;
string content;
while(flag){
start.clear();
end.clear();
content.clear();
cin>>start;
if(start=="ENDOFINPUT"){
flag=0;
break;
}
if(start=="START"){
int flag2=1;
while(flag2){
cin.get(); //先把缓冲区的内容拿走
//可能geiline会直接跳过 因为其会先从缓冲区读取数据 上一次输入的换行符还留在缓冲区 会被直接读取从而跳过
getline(cin,content); //string类直接cin会被空格截断 getline不会
cin>>end;
if(end =="END"){
process(content);
flag2=0;
break;
}else{
content+=end; //应对可能的情况 换行继续输字符
}
}
}
}
return 0;
}



#include<iostream>
using namespace std;
int main(){
int n;
while(cin>>n){
int i,j;
int a[n][n];
int num=0;
for(j=0;j<n;j++){
if(j==0 || j%2==0){
for(i=0;i<n;i++){
a[i][j]=++num;
}
}else if(j%2!=0){
for(i=n-1;i>=0;i--){
a[i][j]=++num;
}
}
}
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(j!=n-1)
cout<<a[i][j]<<" ";
else{
cout<<a[i][j]<<" "<<endl;
}
}
cout<<endl;
}
return 0;
}


#include<iostream>
#include<cmath>
using namespace std;
int judge(int month){
if(month==1 || month==3 || month==5 ||month==7 || month==8||month==10||month==12)
return 31;
else if(month==2)
return 28;
else
return 30;
}
int main(){
int n;
while(cin>>n){
while(n>0){
int a,b,c,d,e;
int days=0;
cin>>a>>b>>c>>d>>e;
if(a==d)
days=e-b;
else if(a<d){
days=judge(a)-b;
for(int i=a+1;i<d;i++)
days+=judge(i);
days+=e;
}
cout<<int(c*pow(double(2),days))<<endl; //数据类型int很重要 否则报错
n--;
}
}
return 0;
}


我的算法 结果正确 但是时间耗费太多了 没有办法通过
#include<iostream>
using namespace std;
int juage(int a,int b){
int k;
for(k=2;k<=a;k++){
if(a%k==0&&b%k==0)
return 0;
}
if(k>a)
return 1;
}
int main(){
int n;
while(cin>>n){
if(n==0)
break;
int i,j;
int a[n];
for(i=0;i<n;i++){
cin>>a[i];
}
int num=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(juage(a[i],a[j]) && a[i]<a[j])
num++;
}
cout<<num<<endl;
}
return 0;
}
优化版算法 运用递归节省时间
//运用递归减少时间
#include<stdio.h>
#include<iostream>
#define N 601
using namespace std;
int panduan(int a,int b)//求最大公约数
{
if(a%b==0)
{
return b;
}
else
{
return panduan(b,a%b);
}
}
int main()
{
int n,i,j,cxk=0;
int a[N];
while(cin>>n)
{
if(n==0)
break;
int cxk=0;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(panduan(a[i],a[i+j])==1)
cxk++;
}
}
cout<<cxk<<endl;
}
return 0;
}


#include<iostream>
using namespace std;
int marked;
string compare(string a,string b){
int i=1;
int flag=1;
while(flag){
if(i==int(a.length())){
marked=1;
return a;
}
if(i==int(b.length())){
return b;
marked=2;
}
if(int(a[i])>int(b[i])){
flag=0;
marked=1;
return a;
}else if(int(a[i])<int(b[i])){
flag=0;
marked=2;
return b;
}else{
i++;
}
}
}
int main(){
int n;
while(cin>>n){
string a[n];
int i=0;
while(i<n){
cin>>a[i];
i++;
}
string result;
int temp=n;
string temps="0";
while(temp){
int mark;
for(i=0;i<n;i++){
if(int(a[i][0])>int(temps[0])){
temps.clear();
temps=a[i];
mark=i;
}else if(int(a[i][0])==int(temps[0])){
string temps2=compare(a[i],temps);
temps.clear();
temps=temps2;
if(marked==1){
mark=i;
}
}
}
result+=temps;
a[mark].clear();
a[mark]="0";
temps="0";
temp--;
}
cout<<result<<endl;
}
return 0;
}
版权声明:本文为weixin_51339377原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。