首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

简单有关问题

2012-02-06 
简单问题简单问题,多分刺激:输出444444444444444444444444444444444444444448888888888888888888888888888

简单问题
简单问题,多分刺激:
输出4444444444444444444444444444444444444444488888888888888888888888888888的二进制形式,   八进制形式,十六进制形式.

[解决办法]
#include <iostream>
#include <conio.h>

using namespace std;

int main()
{
int num[17] = {4444,4444,4444,4444,4444,4444,4444,4444,4444,4444,4888,8888,8888,8888,8888,8888,8888};
int flag_ok = 0,i,k=198;
char dst[200];
dst[199]= '\0 ';
while (1)
{
if (num[16] == 1 || num[16] == 0)
{
flag_ok = 1;
for (i=0;i <=15;++i)
if (num[i]!=0)
{
flag_ok = 0;
break;
}
}
if (flag_ok == 1)
break;
dst[k--] = num[16]%2 + '0 ';
num[16] /=2;
for (i=15;i> =0;--i)
{
if (num[i]%2 == 1)
num[i+1] += 5000;
num[i] /= 2;
}
}
dst[k] = num[16] + '0 ';
cout < <&dst[k] < <endl;
getch();
return 0;
}
[解决办法]
转化到 2进制,模拟手算的过程:
【至于到 8进制和16进制,那么根据2进制结果转化就是了】

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

void cdel0(char *r);
int scmp(char *r, char *u);
char *sdivkr(char *u, char *v, char **rout);

int main(int argc, char* argv[])
{
char str[]= "888888 ";
char s2[200], s8[80], s16[50];
char *result, *remind, tmp[8]={0};
int i=0, j;

result = sdivkr(str, "2 ", &remind);
s2[i++] = *remind;
while(strcmp(result, "0 ") != 0)
{
strcpy(str, result);
free(result);
free(remind);

result = sdivkr(str, "2 ", &remind);
s2[i++] = *remind;
}
s2[i] = '\0 ';
printf( "Ratio=2:\n ");
for(j=strlen(s2)-1; j> =0; j--)
printf( "%c ", s2[j]);
printf( "\n ");

system( "pause ");
return 0;
}

//去掉整数串表示前面多余的零,最后结果为空串时置为 "0 "
void cdel0(char *r)
{
unsigned int lr;
int i=0, j;
lr=strlen(r);
while(r[i]== '0 ')
++i;
if(i> 0)
{
for(j=0; j <lr-i; ++j)
r[j]=r[j+i];
for(j=lr-i; j <lr; ++j)
{
r[j]= '\0 ';
}
}
if(r[0]== '\0 ')
{
r[0]= '0 ';
}
}

int scmp(char *r, char *u)
{
unsigned int lr, lu;
cdel0(r);
cdel0(u);

lr=strlen(r);
lu=strlen(u);

if(lr> lu)
{
return 1;
}
else if (lr <lu)
{
return -1;
}
return (strcmp(r, u));

}//end scmp()

//两个串表示数的减法
char *ssub(char *r, char *u)
{
unsigned int i,lr, lu, lp,c=0;
char h,hc;
char *p;
if(scmp(r, u) <0)
return NULL;
lr=strlen(r);
lu=strlen(u);
p=(char *)malloc((unsigned int)(lr+1)*sizeof(char));
for(i=0; i <lu; ++i)
{
h=r[lr-i-1]-u[lu-i-1]-c;
if(h <0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]=h+ '0 ';
hc=h+ '0 ';


}
for (i=lu; i <lr; ++i)
{
h=r[lr-i-1]- '0 '-c;
if(h <0)
{
c=1;
h=h+10;
}
else
c=0;
p[i]= '0 '+h;
hc= '0 '+h;
}
p[i]= '\0 ';
lp=i-1;

while(p[lp]== '0 '&&lp!=0)
{
p[lp]= '\0 ';
lp--;
}

for(i=0; i <(lp+1)/2; ++i)
{
hc=p[i];
p[i]=p[lp-i];
p[lp-i]=hc;
}
return (p);
}//end ssub()

//两个串表示数的除法,结果分别用整商与余数表示
char *sdivkr(char *u, char *v, char **rout)
{
char *f, *r;
unsigned int i, lu, lv, lr, iw;
int kh;
lu=strlen(u);
lv=strlen(v);

f=(char *)malloc((unsigned int)(lu+1)*sizeof(char));
for(i=0; i <lu+1; ++i) f[i]= '\0 ';
r=(char *)malloc((unsigned int)(lv+2)*sizeof(char));
for(i=0; i <lv+2; ++i) r[i]= '\0 ';

for(iw=0; iw <lu; ++iw)
{
cdel0(r);
lr=strlen(r);
r[lr]=u[iw];
r[lr+1]= '\0 ';
kh=0;
while(scmp(r, v)> =0)
{
r=ssub(r, v);
++kh;
}
f[iw]=kh+ '0 ';
}
cdel0(r);
*rout=r;
cdel0(f);
return(f);
}//end *sdivkr()
[解决办法]
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <stack>

using namespace std;

/**
* 函数声明区域
*/
int bigDivide(const int* dividend,
const int length,
int divisor,
int* result,
int* resultLength);
void printNode(int num);
bool isZero(const int* data, int length);
int assignment(int* des, const int* src, int length);

/**
* 应用程序入口
*/
int main(int argc, char** argv) {
int dividend[] = { 139, 0003, 3333, 4444, 5555, 6666 };
// 从后向前,可以从命令行输入字符串来解析成些格式的数字数组

int length = sizeof(dividend) / sizeof(int);
int result[length];
int divisor = 2;
int resultLength = 0;
stack <char> bits;

/*cout < < bigDivide(dividend, length, divisor, result, &resultLength) < < endl;;
for (int i = 0; i < resultLength; i++) {
printNode(result[i]);
}*/

do {
// 把余数压入栈中,利用的是除基取模倒序法.
bits.push(bigDivide(
dividend,
length,
divisor,
result,
&resultLength)+ '0 ');

length = assignment(dividend, result, resultLength);
resultLength = 0;
} while (!isZero(dividend, length));

while (!bits.empty()) {
cout < < bits.top();
bits.pop();
}

return 0;
}

/**
* 求一个大数除以一个整数,大数数组中的每个数以四位来存储,即小于10000,商存储在结果数组中,返回余数
* @param dividend: 被除数
* @param length: 被除数的数组的长度
* @param divisor: 除数
* @param result: 存放结果的数组
* @param resultLength: 结果数组的长度
* @return 返回余数
*/
int bigDivide(const int* dividend,


const int length,
int divisor,
int* result,
int* resultLength) {
int temp = 0;
int index = 0;
for (int i = -1; i < length - 1; i++) {
temp = temp * 10000 + dividend[i + 1];

result[index++] = temp / divisor;
temp %= divisor;
}
*resultLength = index;

return temp; // 返回余数
}

/**
* 按格式输出数字,每个数字占4个字符
* 如:23输出为0023, 1为0001
*/
void printNode(int num) {
if (num > 1000) {
cout < < num < < " ";
} else if (num > 100) {
cout < < "0 " < < num < < " ";
} else if (num > 10) {
cout < < "00 " < < num < < " ";
} else {
cout < < "000 " < < num < < " ";
}
}

/**
* 判断一个大数是否是零
* @param data: 表示大数的数组
* @param length: 数组的长度
* @return 如果是零,返回true,否则返回false
*/
bool isZero(const int* data, int length) {
for (int i = 0; i < length; i++) {
if (data[i] != 0) {
return false;
}
}

return true;
}

/**
* 把一个大数数组的前非零项赋值给另一个大数数组
* @param des: 目标数组
* @param src: 源数组
* @param length: 源数组的长度
* @return 返回前非零的个数,即有效长度,如0000 1123的有效长度是1
*/
int assignment(int* des, const int* src, int length) {
int index = 0;
int size = 0; // des的长度

// 过滤掉前面的零
for (index = 0; index < length; index++) {
if (src[index] != 0) {
break;
}
}

for (; index < length; index++, size++) {
des[size] = src[index];
}

return size;
}

热点排行