整數劃分編程
⑴ 如何用c++求解整數劃分問題
貼個c語言的:*
描述 Description �0�2
�0�2 將整數n分成k份,且每份不能為空,任意兩份不能相同(不考慮順序)。
例如:n=7,k=3,下面三種分法被認為是相同的。
1,1,5; 1,5,1; 5,1,1;
問有多少種不同的分法。
�0�2
�0�2 �0�2
�0�2 �0�2
�0�2輸入格式 Input Format �0�2
�0�2 輸入n,k (6<n<=200,2<=k<=6) �0�2
�0�2 �0�2
�0�2 �0�2
�0�2輸出格式 Output Format �0�2
�0�2 一個整數,即不同的分法。�0�2
�0�2Input : 7 3
�0�2output: 4
*/
/*
解題思路:�0�2
我用的是一種比較慢的搜索擴展方法:
比如:
�0�27 = 1+6 6 又可以擴展成:6 = 1+5 很顯然這是一個遞歸的過程
�0�27 = 2+5 5 --> 5= 2+3 不過要注意的是:只要在擴展過程中保證當前所擴展的值不小於前一個即可
�0�27 = 3+4
*/
#include <stdio.h>
#define MAX 101
int n,k ;
long total = 0 ;
void fenjie(int s,int t,int end,int *sum)
{
�0�2 int p,q ;
�0�2 �0�2
�0�2 if(t == k)/*找到一個*/
�0�2 {
�0�2 total ++ ;
�0�2 /*for(q = 1 ; q <= k ; q++)
�0�2 printf("%d ",sum[q]);
�0�2 printf(" ");*/
�0�2 }
�0�2 �0�2
�0�2 else
�0�2 {
�0�2 for(p=s ; p<=end/2 ; p++)
�0�2 {
�0�2 sum[t] = p;
�0�2 sum[t+1] = end-p;
�0�2 �0�2
�0�2 fenjie(p,t+1,sum[t+1],sum); /*方法是從當前結點擴展開出,遞歸進行求解*/
�0�2 }
�0�2 }
�0�2 �0�2
}
int main(void)
{
�0�2 int i,j,sum[MAX] = {0};
�0�2
�0�2 �0�2
�0�2 scanf("%d %d",&n,&k);
�0�2 �0�2
�0�2 for(i=1 ; i<=n/2 ; i++)
�0�2 {
�0�2 sum[1] = i ;
�0�2 sum[2] = n-i;
�0�2 �0�2
�0�2 fenjie(i,2,sum[2],sum);
�0�2 }
�0�2 printf("%ld ",total);/*output the result*/
�0�2 �0�2
�0�2 �0�2
�0�2 return 0 ;
}
⑵ C語言經典100例問題,取一個整數a從右端開始的4~7位,求助,高分!
移位操作是按二進制算的, 右移 一下相當於除2,左移乘2,說以10進制的不能通過移位實現取位,2,8,16進制的都可以哦。
不過還是有辦法,就是用16進制變數存你的10進制變數,然後按16進制移位取位,最後按16進制輸出,可達到你想要的效果哦~
我要上課去了,如代碼還是寫不出來,追問一下,我回來幫你寫個
⑶ c語言函數調用例子
C語言中,函數調用的一般形式為:函數名(實際參數表)
對無參函數調用時則無實際參數表。實際參數表中的參數可以是常數,變數或其它構造類型數據及表達式。各實參之間用逗號分隔。
在C語言中,可以用以下幾種方式調用函數:
1、函數表達式:函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:z=max(x,y)是一個賦值表達式,把max的返回值賦予變數z。
2、函數語句:函數調用的一般形式加上分號即構成函數語句。例如: printf ("%d",a);scanf ("%d",&b);都是以函數語句的方式調用函數。
3、函數實參:函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。