征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算
生活随笔
收集整理的這篇文章主要介紹了
征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目
史豐收速算法的革命性貢獻是:從高位算起,預測進位。不需要九九表,徹底顛覆了傳統(tǒng)手算!速算的核心基礎是:1位數(shù)乘以多位數(shù)的乘法。其中,乘以7是最復雜的,就以它為例。因為,1/7 是個循環(huán)小數(shù):0.142857...,如果多位數(shù)超過 142857...,就要進1同理,2/7, 3/7, ... 6/7 也都是類似的循環(huán)小數(shù),多位數(shù)超過 n/7,就要進n下面的程序模擬了史豐收速算法中乘以7的運算過程。乘以 7 的個位規(guī)律是:偶數(shù)乘以2,奇數(shù)乘以2再加5,都只取個位。乘以 7 的進位規(guī)律是: 滿 142857... 進1, 滿 285714... 進2, 滿 428571... 進3, 滿 571428... 進4, 滿 714285... 進5, 滿 857142... 進6請分析程序流程,填寫劃線部分缺少的代碼。 //計算個位 int ge_wei(int a) {if(a % 2 == 0)return (a * 2) % 10;elsereturn (a * 2 + 5) % 10; }//計算進位 int jin_wei(char* mod) {char* level[] = {"142857","285714","428571","571428","714285","857142"};char buf[7];buf[6] = '\0';strncpy(buf,mod,6);int i;for(i=5; i>=0; i--){int tr = strcmp(level[i], buf);if(tr<0) return i+1;while(tr==0){mod += 6;strncpy(buf,mod,6);tr = strcmp(level[i], buf);if(tr<0) return i+1;______________________________; //填空}}return 0; }//多位數(shù)乘以7 void f(char* s) {int head = jin_wei(s);if(head > 0) printf("%d", head);char* mod = s;while(*mod){int a = (*mod-'0');int x = (ge_wei(a) + jin_wei(mod+1)) % 10;printf("%d",x);mod++;}printf("\n"); }int main() {f("428571428571");dfs("34553834937543");return 0; }注意:通過瀏覽器提交答案。只填寫缺少的內(nèi)容,不要填寫任何多余的內(nèi)容(例如:說明性文字)
代碼
#include <iostream> using namespace std; //計算個位 int ge_wei(int a) {if(a % 2 == 0)//偶數(shù)return (a * 2) % 10;//乘以2保留個位elsereturn (a * 2 + 5) % 10;//奇數(shù),乘以2加上5,保留個位 }//計算進位 int jin_wei(char* mod) {char* level[] = {"142857","285714","428571","571428","714285","857142"};//多位數(shù)超過 n/7,就要進nchar buf[7];buf[6] = '\0';strncpy(buf,mod,6);//將mod這個字符串的前6個字符,拷貝到buff中int i;for(i=5; i>=0; i--){int tr = strcmp(level[i], buf);//從后往前,依次level中的串和buff比較if(tr<0)//buff更大 ,得出了進位數(shù)=i+1return i+1;while(tr==0){//buff和level[i]相同了mod += 6;//往后偏移6位strncpy(buf,mod,6);//再拷貝6個字符到buff中tr = strcmp(level[i], buf);//再比較if(tr<0) return i+1;//buf更大 // ______________________________; //填空 // //?//buff更小if(tr>0) return i;}}return 0; }//多位數(shù)乘以7 void f(char* s)//s代表多位數(shù) {int head = jin_wei(s);//head是s的進位if(head > 0) printf("%d", head);//輸出進位char* mod = s;//拷貝字符串指針while(*mod){//沒有到末尾int a = (*mod-'0');//依次字符轉數(shù)字int ge = ge_wei(a);//算出個位int jin = jin_wei(mod + 1);//后續(xù)字符串的進位int x = (ge + jin) % 10;//兩者相加取個位printf("%d",x);//打印mod++;//指針后移}printf("\n"); }int main() {f("4285711");f("34553834937543");return 0; }總結
以上是生活随笔為你收集整理的征战蓝桥 —— 2014年第五届 —— C/C++A组第4题——史丰收速算的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征战蓝桥 —— 2014年第五届 ——
- 下一篇: 信息学奥赛一本通(C++)在线评测系统—