日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法题3 寻找丑数数值逼近

發布時間:2025/5/22 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法题3 寻找丑数数值逼近 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

只包含因子2、3、5的數字被稱為丑數。例如4和6是丑數,而14不是丑數,因為含有因子7。習慣上把1作為第一個丑數。求按從小到大順序的第1500個丑數。

分析

假設一個丑數順序數組ugly_nums[],對于其中一個丑數ugly=ugly_nums[x],存在2*ugly_nums[i-1]<=ugly,2*ugly_nums[i]>ugly,也就是說2乘以一個丑數剛剛大于丑數ugly;

同理也存在3*ugly_nums[j-1]<=ugly,3*ugly_nums[j]>ugly,和5*ugly_nums[k-1]<=ugly,5*ugly_nums[k]>ugly。

那么第x+1個丑數應該是3個倍數結果中最小的那個,即ugly_nums[x+1]=min{2*ugly_nums[i],3*ugly_nums[j],5*ugly_nums[k]};

這應該算是一種數值逼近的思想,遇到一些需要計算的數值需找時可以考慮,比如找順序數組中滿足和為某值得數字對

算法需要借助一個輔助數組存儲丑數,空間復雜度O(n)。時間復雜度O(n)

代碼

1 int FindUglyNum(unsigned int index) 2 { 3 int *uglynums=new int[index]; 4 5 uglynums[0]=1; 6 uglynums[1]=2; 7 uglynums[2]=3; 8 uglynums[3]=4; 9 uglynums[4]=5; 10 11 unsigned int i=1,j=1,k=1; 12 unsigned int min_uglynum=0; 13 unsigned int idx=4; 14 while (idx<index) 15 { 16 if (2*uglynums[i]<uglynums[idx]) 17 { 18 i++; 19 } 20 if (3*uglynums[j]<uglynums[idx]) 21 { 22 j++; 23 } 24 if (5*uglynums[k]<uglynums[idx]) 25 { 26 k++; 27 } 28 min_uglynum=MIN(MIN(2*uglynums[i],3*uglynums[j]),5*uglynums[k]); 29 uglynums[++idx]=min_uglynum; 30 } 31 32 return uglynums[index-1]; 33 }

 

數值逼近之和為n的連續整數序列

  輸入一個整數,輸出所有和為n的連續正數序列。例如:輸入15,由于15=7+8=4+5+6=1+2+3+4+5,所以輸出的序列為1,2,3,4,5;4,5,6;7,8

分析

  由于要求的子序列是連續的,那么就可以連續數字的相加一點一點逼近n。設small=big=1,sum=small+big,移動big并計算新sum=sum+big,直到sum>=n,如果sum=n,則small到big是所求的子序列之一,

  若sum>n,則調整small向后移動,直到sum<=n。循環依次調整big和small,直到small=n/2

代碼

1 void FindContinuousNumbers(int n) 2 { 3 int small = 1,big = 1; 4 int middle = n/2; 5 int sum = small; 6 7 while(small <=middle&&big<=n) 8 { 9 sum += big; 10 11 if(sum == n) 12 { 13 for(int i = small;i <= big;++i) 14 cout<<i<<" "; 15 cout<<endl; 16 } 17 18 while(sum > n) 19 { 20 sum-=small; 21 small++; 22 23 if(sum == n) 24 { 25 for(int i = small;i <= big;++i) 26 cout<<i<<" "; 27 cout<<endl; 28 } 29 30 } 31 big++; 32 } 33 }

?

數值逼近之升序數組中和為n的數字對

  輸入一個已經按升序排列的數組,一個給定的數字num,在數組中查找兩個數,使得它們的和等于n。要求時間復雜度為O(n),如果存在多對滿足條件的數字對,只給出一對即可

分析:

  既然是已經排列好的數組,又是求和,那么也可以用數值逼近的方式求解。設small=arr[0],big=arr[n-1],sum=small+big,若sum=num,則small和big就是要找的數對之一,若sum>num,則向前調整big,若sum<num,則向后調整small,直至small=big,循環結束。本題既然只要求給出一對數字,那么當sum=num時就可以停止查找了

代碼 

1 void FindSumPairs(int arr[],int len,int num) 2 { 3 if (arr==NULL||len<=0) 4 throw std::exception("Invalid input."); 5 int small=0,big=len-1; 6 int sum=0; 7 8 while (small<big) 9 { 10 sum=arr[small]+arr[big]; 11 12 if (sum==num) 13 cout<<arr[small]<<' '<<arr[big]<<endl; 14 15 if (sum>num) 16 big--; 17 18 if (sum<num) 19 small++; 20 } 21 22 }

?

    

轉載于:https://www.cnblogs.com/wangzaizhen/p/5167015.html

總結

以上是生活随笔為你收集整理的算法题3 寻找丑数数值逼近的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。