標題:史豐收速算
史豐收速演算法的革命性貢獻是:從高位算起,預測進位。不需要九九表,徹底顛覆了傳統手算!
速算的核心基礎是:1位元乘以多位元的乘法。
其中,乘以7是最複雜的,就以它為例。
因為,1/7是個迴圈小數:0.142857...,如果多位元超過142857...,就要進1
同理,2/7,3/7,...6/7也都是類似的迴圈小數,多位元超過n/7,就要進n
下面的程式類比了史豐收速演算法中乘以7的運算過程。
乘以7的個位規律是:偶數乘以2,奇數乘以2再加5,都只取個位。
乘以7的進位規律是:
滿142857...進1,
滿285714...進2,
滿428571...進3,
滿571428...進4,
滿714285...進5,
滿857142...進6
請剖析器流程,填寫劃線部分缺少的代碼。
//計算個位
intge_wei(inta)
{
if(a%2==0)
return(a*2)%10;
else
return(a*2+5)%10;
}
//計算進位
intjin_wei(char*p)
{
char*level[]={
"142857",
"285714",
"428571",
"571428",
"714285",
"857142"
};
charbuf[7];
buf[6]='\0';
strncpy(buf,p,6);
inti;
for(i=5;i>=0;i--){
intr=strcmp(level[i],buf);
if(r<0)returni+1;
while(r==0){
p+=6;
strncpy(buf,p,6);
r=strcmp(level[i],buf);
if(r<0)returni+1;
______________________________;//填空
}
}
return0;
}
//多位元乘以7
voidf(char*s)
{
inthead=jin_wei(s);
if(head>0)printf("%d",head);
char*p=s;
while(*p){
inta=(*p-'0');
intx=(ge_wei(a)+jin_wei(p+1))%10;
printf("%d",x);
p++;
}
printf("\n");
}
intmain()
{
f("428571428571");
f("34553834937543");
return0;
}
#include<stdio.h>#include<stdlib.h>//計算個位#include<string.h>intge_wei(inta){if(a%2==0)return(a*2)%10;elsereturn(a*2+5)%10;}//計算進位intjin_wei(char*p){char*level[]={"142857","285714","428571","571428","714285","857142"};charbuf[7];buf[6]='\0';strncpy(buf,p,6);inti;for(i=5;i>=0;i--){intr=strcmp(level[i],buf);if(r<0)returni+1;while(r==0){p+=6;strncpy(buf,p,6);r=strcmp(level[i],buf);if(r<0)returni+1;returni;//填空}}return0;}//多位元乘以7voidf(char*s){inthead=jin_wei(s);if(head>0)printf("%d",head);char*p=s;while(*p){inta=(*p-'0');intx=(ge_wei(a)+jin_wei(p+1))%10;printf("%d",x);p++;}printf("\n");}intmain(){f("428571428571");f("34553834937543");return0;}