亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
樓主: DNFCF
打印 上一主題 下一主題

[算法] 變態(tài)的算法題 [復(fù)制鏈接]

論壇徽章:
2
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-06-17 22:20:00每日論壇發(fā)貼之星
日期:2015-06-17 22:20:00
11 [報告]
發(fā)表于 2011-04-28 22:03 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
12 [報告]
發(fā)表于 2011-04-28 22:04 |只看該作者
回復(fù) 8# cjaizss


    不懂。。。。

論壇徽章:
0
13 [報告]
發(fā)表于 2011-04-28 22:05 |只看該作者
回復(fù)  DNFCF


      硬件環(huán)境是什么
pmerofc 發(fā)表于 2011-04-28 22:03



    硬件可以不考慮,這個主要是考算法。。。。

論壇徽章:
2
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-06-17 22:20:00每日論壇發(fā)貼之星
日期:2015-06-17 22:20:00
14 [報告]
發(fā)表于 2011-04-28 22:07 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
15 [報告]
發(fā)表于 2011-04-28 22:09 |只看該作者
回復(fù)  DNFCF


    問題是要求3分鐘,有的機(jī)器快,有的機(jī)器慢
pmerofc 發(fā)表于 2011-04-28 22:07



    老大,你先忽略這個時間限制行不??先給個算法思路吧。。。。

論壇徽章:
2
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-06-17 22:20:00每日論壇發(fā)貼之星
日期:2015-06-17 22:20:00
16 [報告]
發(fā)表于 2011-04-28 22:13 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
17 [報告]
發(fā)表于 2011-04-28 22:28 |只看該作者
我的想法和10樓差不多

先把 0~9 的21次方算好存起來
然后從 10的20次方開始 到 10的21次方-1 窮舉 計算 ...
pmerofc 發(fā)表于 2011-04-28 22:13



    問題是數(shù)太大了,會溢出的???

論壇徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-03 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-08-04 06:20:00
18 [報告]
發(fā)表于 2011-04-28 22:37 |只看該作者
問題是數(shù)太大了,會溢出的???
DNFCF 發(fā)表于 2011-04-28 22:28


不是窮舉,是湊數(shù)。
看看每個數(shù)的差距
linux-0gt0:~ # bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
for(i=1;i<=9;i++)
print i^21,"\n"
1
2097152
10460353203
4398046511104
476837158203125
21936950640377856
558545864083284007
9223372036854775808
109418989131512359209

論壇徽章:
0
19 [報告]
發(fā)表于 2011-04-28 22:57 |只看該作者
不是窮舉,是湊數(shù)。
看看每個數(shù)的差距
linux-0gt0:~ # bc
bc 1.06
Copyright 1991-1994, 1997, 199 ...
cjaizss 發(fā)表于 2011-04-28 22:37



    可是在C語言下,好像超過10位就會溢出啊,怎么解決啊??

論壇徽章:
0
20 [報告]
發(fā)表于 2011-04-29 06:30 |只看該作者
本帖最后由 KBTiller 于 2011-04-29 06:40 編輯
可是在C語言下,好像超過10位就會溢出啊,怎么解決啊??
DNFCF 發(fā)表于 2011-04-28 22:57



    想辦法創(chuàng)造新的“類型”。編程的樂趣之一就是這種創(chuàng)造性。感覺你還沒體會到什么是數(shù)據(jù)結(jié)構(gòu)
    手懶,抄段書(自《狂人C》第3章)給你,希望能對你有所啟發(fā)


1976年,著名的計算機(jī)大師、Pascal語言之父Niklaus Wirth提出

       算法 + 數(shù)據(jù)結(jié)構(gòu) = 程序



Algorithms + Data Structures = Programs
    ……
   例題:編程求123456×654321。
   ……
   

難道C語言對待如此簡單的小學(xué)生都會做的算術(shù)問題都束手無策嗎?倒也不是這樣,辦法是有的,但需要你自己去想。編程的樂趣大抵在此。

由于本題目問題的核心在于兩個較大的數(shù)相乘超過了int類型的范圍,所以可以考慮把乘數(shù)拆成較小的數(shù)。比如

123456×654321=123×103+456)×(654×103+321

=123×103×(654×103+321+ 456×(654×103+321

=123×103×654×103+123×103×321+ 456×654×103+ 456×321

=123×654×106+123×321×103+ 456×654×103+ 456×321

=123×654)×106+123×321+ 456×654)×103+ 456×321

如果能分別求出(123×654)、(123×321+ 456×654)、456×321,問題不就解決了嗎?而(123×654)、(123×321+ 456×654)、456×321,可以確信,是可以用int類型表示的。

在這種情況下,用一個int變量存儲123456654321是不行的,需要兩個,一個用來記錄123456654321的前三位,另一個記錄后三位。這種對數(shù)據(jù)的組織和安排方式,就是所謂的數(shù)據(jù)結(jié)構(gòu)。盡管這里的還只是一種很粗糙的數(shù)據(jù)結(jié)構(gòu)。此外還可以發(fā)現(xiàn),設(shè)計數(shù)據(jù)結(jié)構(gòu)首先涉及到的問題恰恰是選擇合適的數(shù)據(jù)類型。

在這種數(shù)據(jù)結(jié)構(gòu)下的算法就是:首先求出(123×654)、(123×321+ 456×654)、456×321?梢詳喽ǚe的最后三位是456×3211000求余的結(jié)果,最前面幾位是(123×654+123×321+ 456×654/103,中間三位的值為(123×321+ 456×654%103+456×321/1000。(這些示意性的東西叫偽代碼(Pseudocode

從對算法的描述中還可以發(fā)現(xiàn),積最好用三個int來表示。

所以,所謂的算法無非就是對操作步驟的描述。描述算法的方式有很多,其中之一就是使用自然語言來描述。用C語言描述的算法和數(shù)據(jù)結(jié)構(gòu)就是C代碼。

  1. /*編程求123456*654321*/

  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define CS1 123456  //乘數(shù)1
  5. #define CS2 654321  //乘數(shù)2
  6. #define YQ  1000    //一千

  7. int main(void)
  8. {
  9. int cs1_q3w,cs1_h3w,cs2_q3w,cs2_h3w;//乘數(shù)1、乘數(shù)2的前3位和后3位
  10. int ji_q,ji_z,ji_h; //積的前、中、后三個部分
  11.   
  12. cs1_q3w = CS1 / YQ ;
  13. cs1_h3w = CS1 % YQ ;
  14.   
  15. cs2_q3w = CS2 / YQ ;
  16. cs2_h3w = CS2 % YQ ;

  17. //求出(123×654)、(123×321+ 456×654)、456×321
  18. ji_q = cs1_q3w * cs2_q3w ;
  19. ji_z = cs1_q3w * cs2_h3w + cs1_h3w * cs2_q3w ;
  20. ji_h = cs1_h3w * cs2_h3w ;  

  21. //進(jìn)位處理,注意:次序很重要
  22. ji_q = ji_q + ji_z / YQ ;
  23. ji_z = ji_z % YQ + ji_h / YQ ;
  24. ji_h = ji_h % YQ ;
  25. //輸出  
  26. printf("%d×%d == %d%d%d\n" , CS1 , CS2 , ji_q , ji_z ,ji_h );

  27. system("PAUSE");
  28. return 0;
  29. }
復(fù)制代碼

程序輸出

123456×654321 == 80779853376

程序代碼3-5的輸出相比,這個結(jié)果至少可以說可信度很高,盡管我們還無法確信。

增強(qiáng)對程序正確性信心的方法只有通過測試。由于這段代碼對于兩個不多于6位的十進(jìn)制數(shù)都應(yīng)該成立,所以可以選擇易于驗算的情況運(yùn)行程序,比如把123456改為100000再運(yùn)行程序

然而,很遺憾,程序求100000×654321的結(jié)果竟然是

100000×654321 == 654321000

造成這個錯誤的原因是,代碼中ji_zji_h表示的都是三位的十進(jìn)制數(shù),但當(dāng)它們的值為0時,%d這種格式只輸出10而不是30。改進(jìn)的辦法是把它們對應(yīng)的%d改成%03d。其中3表示輸出三位,0表示如果前面有空格則填充0(可以自己上機(jī)對比一下%03d、%3d和%d之間的區(qū)別)。

把輸出改寫為

printf("%d×%d == %d%03d%03d\n" , CS1 , CS2 , ji_q , ji_z ,ji_h );
之后,可以發(fā)現(xiàn)程序求100000×654321的結(jié)果是正確的。如果還不放心,可以再找一些數(shù)據(jù)進(jìn)行測試。


您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP