69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <math.h>
#define max 30
int a[max] ;
int b[max] ;
int expon ;
int IsPrimeNumber( int factor )
{
int k ;
int m;
(int)k=sqrt(factor); //判别i是否为素数,只需使2~根号i之间的每一个整数去除
for(m=2;m<=k;m++)
if(factor%m==0) break;
if(m>k)
return 1 ;
else return 0 ;
}
void search(int remainder , int factor ,int nTerm )//剩余值,起始因子
{
/*int expon;*/ //指数,第nTerm项
int i ;
int k ;
if(remainder==1||remainder==factor) //递归出口
{
a[nTerm] = factor ;
b[nTerm] = expon+1 ;
printf( "%d^%d" , a[0],b[0] ) ;
for( k=1 ; k<nTerm-1 ; k++ )
printf( "*%d^%d",a[k],b[k] ) ;
//如果指数为1不打印,太麻烦先这么用吧
printf( "*%d^%d\n",a[k],b[k] ) ;
return ;
}
else
{
for( i=factor ; i<=remainder ; i++,expon=0 )//递归出口可否放在循环内部
{
//如果已经是素数只能分解为自身时应该输出
if( IsPrimeNumber(i) && remainder%i==0 ) //如果i是因子且剩余值remainder能整除这个因子,保存数据
{
if(a[nTerm]!=i/*i!=factor*/) //如果因子发生变化则项数加1,没变化项数不变
nTerm++ ;
expon++ ;
a[nTerm] = factor ;
b[nTerm] = expon ;
//判断remainder/i是否为0即判断remainder是否等于i
search( remainder/i , i , nTerm) ;//remainder/i必须是整数,当输入20运行到5时remainder/i为1无法输出
}
else if( !IsPrimeNumber(i) ||remainder%i!=0/*&& remainder%i!=0*/ ) //如果不是素数或者无法整除,进入下一个因子的判断
{
continue ;
}
}
}
}
int main()
{
int N;
scanf( "%d" , &N ) ;
expon=0 ; //遗漏,并改为全局变量
printf("%d=",N);
search( N , 2 , 0) ;
//如果起始因子从1开始那么当整数是1时数据无法保存,故整数N=1单独考虑
}
void split(int n){
if (n<=1) return;
printf ("1");
for (int i = 2; i <= n; i++){
int k = 0;
while (n%i == 0) {
n = n / i;
k++;
}
if ( k > 0) {
printf("*%d^%d", i, k);
}
}
}
[/quote]#include <iostream>
using namespace std;
struct MyStruct {
int Nodedata;
MyStruct *pLeft;
MyStruct *pRight;
} s1,s2,s3,s4,s5,s6,s7,s8;
void ashow(MyStruct * p) {
if (p != nullptr) {
ashow(p->pLeft);
ashow(p->pRight);
cout << p->Nodedata << endl;
if (p->Nodedata == 4) {
throw 1;//退出递归.直接返回.
}
}
}
int main() {
MyStruct *pRoot;//根
pRoot = &s1;
s1.Nodedata = 1;
s2.Nodedata = 2;
s3.Nodedata = 3;
s4.Nodedata = 4;
s5.Nodedata = 5;
s6.Nodedata = 6;
s7.Nodedata = 7;
s8.Nodedata = 8;
s1.pLeft = &s2;
s1.pRight = &s3;
s2.pLeft = &s4;
s2.pRight = &s5;
s3.pLeft = &s6;
s3.pRight = &s7;
try {
ashow(pRoot);
} catch (int err) {
cout<<"catch err "<<err<<endl;
}
return 0;
}
//4
//catch err 1
//
void split(int n){
if (n<=1) return;
printf ("1");
for (int i = 2; i <= n; i++){
int k = 0;
while (n%i == 0) {
n = n / i;
k++;
}
if ( k > 0) {
printf("*%d^%d", i, k);
}
}
}
void split(int n){
if (n<=1) return;
map<int, int> factors;
for (int i = 2; i <= n; i++){
while (n%i == 0) {
n = n / i;
factors[i] ++;
}
}
printf ("1");
for (auto &v: factors) {
printf("*%d^%d", v.first, v.second);
}
}
代码有了,不给