这篇文章能和大家见面着实不易┭┮﹏┭┮,难题(对我来说)毕竟是难题,得用时间来堆积啊!!
而且这篇文章还要作为珍藏版,实时更新♪(∇*)
今天要做一道题:大数乘法,使我不禁想到假期曾经被比这个还稍微简单的大数乘法支配了一个下午的恐惧ヽ( ̄︿ ̄ )("▔□▔)(⊙﹏⊙) ,于是在百度上寻找到一种新的方法
瑞格7079 大数乘法(C语言实现)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 55
//为何遍历从N开始?已经初始化为0了,所以无所谓嘛!
int main()
{
char a[N],b[N];//用字符定义两个大数
int c[N]= {0},d[N]= {0},e[N]= {0};
int a1,b1,k;
int i,j,x;
scanf("%s %s",a,b);
a1=strlen(a);//分别记录两个大数的长度
b1=strlen(b);
x=0;
for(i=a1-1; i>=0; i--) //倒序存储两个大数的每一位,并转化成数字
{
c[x]=a[i]-48;
x++;
}
x=0;//为了位置对应,选择同一个x
for(i=b1-1; i>=0; i--) //倒序存储两个大数的每一位,并转化成数字
{
d[x]=b[i]-48;
x++;
}
for(i=0; i<a1; i++) //对应位置分别相乘并相加
for(j=0; j<b1; j++)
{
e[i+j]+=c[i]*d[j];
}
for(k=0; k<N; k++)//处理进位
{
if(e[k]>=10)
{
e[k+1]+=e[k]/10;
e[k]=e[k]%10;
}
}
for(k=N-1; k>=0; k--) //找到从左边起第一个不是0的位置
{
if(e[k]!=0)
break;
}
for(; k>=0; k--) //从不是0的数字开始倒序输出
printf("%d",e[k]);
printf("\n");
return 0;
}
瑞格5812(逆序输出英文句子)
这道题能写出来真是太太不容易啦!!!在大佬的帮助下,我才成功的改对(大佬写的也是相当的坎坷曲折),其中get到一个删除函数的用法!下面来简单的分析一下如何用它来删除一个英文句子中的多余的空格(__) 嘻嘻
void dele(char a[])
{
int i,j;
while(a[0]==' ')//为了连续删除单词最前面的空格
{
for(i=0;a[i];i++)
a[i]=a[i+1];
}
for(i=0;a[i];i++)//遍历整个英文句子
{
while(a[i]==' '&&a[i]==a[i+1])//遇到了连续不止一个空格
{
for(j=i;a[j];j++)
a[j]=a[j+1];
}
}
int len=strlen(a);
for(i=len-1;a[i]==' ';i--)//删除最后一个单词后面的空格
a[i]='\0';
}
其实核心就是第一段删除代码,这回记住了٩(๑òωó๑)۶
瑞格5808(拆分单词)
老师的方法是我见过的最好的方法了(我和大佬一共算起来也写了3个版本,但都好麻烦,所以在此处只展示老师的方法啦n(≧▽≦)n)
#include <stdio.h>
#include <stdlib.h>
int splitword(char str[],char word[][30])
{
int n=0,i=0,j;
char ch;
while(str[i]!='\0')
{
while(str[i]==' ')//如果为空格,啥也不干,继续走
i++;
if(str[i]=='\0')
break;
j=0;
while(str[i]>='A'&&str[i]<='Z'||str[i]>='a'&&str[i]<='z')
{
word[n][j]=str[i];
i++;j++;
}
word[n][j]='\0';//因为此数组不知道要存多少个字母,所以要手动添加结束标志
n++;
}
return n;
}
int main()
{
char stra[1000],word[300][30],ch;
int i,countn;
gets(stra);
countn=splitword(stra,word);
for(i=0;i<countn;i++)
puts(word[i]);
return 0;
}