USACO基础第七题Palindromic Squares

  USACO很多函数都限制掉了,不让用,所以很多库函数都会WA,后面找的模板和库函数都用不上了,逼我直接写了个最脑残的程序,输入输出还输反了。无限wa。总之要小心,库函数不要随便用。特别是比较生疏的,wa的可能性比较大。可能网站的目的就是让自己从头开始写,什么都得自己写。比如itoa,goto等都不提供。纯粹的编码。strlen都不让用。

  因为这个题是处理数,所以平时那些对付字符串的函数都用不上。把数字转化成字符串其实有函数,但是绝对不好使。网站不会这么轻易让你ac的。这是我用字符串接受和保存进制转换的代码:

//s[]: 原进制数字,用字符串表示
//s2[]: 转换结果,用字符串表示
//d1: 原进制数
//d2: 需要转换到的进制数
//高于9 的位数用大写'A'~'Z'表示,2~16 位进制通过验证
void change(char s[], char s2[], int d1, int d2)
{
	int i, j, t, num = 0;
	char c;
	for (i = 0; s[i] != '\0'; i++)
	{
		if (s[i] <= '9' && s[i] >= '0')
			t = s[i] - '0';
		else t = s[i] - 'A' + 10;
		num = num * d1 + t;
	}
	i = 0;
	while (true)
	{
		t = num % d2;
		if (t <= 9)
			s2[i] = t + '0';
		else s2[i] = t + 'A' - 10;
		num /= d2;
		if (num == 0)break;
		i++;
	}
	for (j = 0; j < i / 2; j++)
	{
		c = s2[j]; 
		s2[j] = s[i - j];
		s2[i - j] = c;
	}
	s2[i + 1] = '\0';
}

判断字符串是不是回文串的比较简单:

//判断是否是回文串
bool pal(char s[])
{
	int i;
	for (i = 0; s[i] != '\0'; i++);
	bool flag = true;
	for (int k = 0; k < i / 2; k++)
		if (s[k] != s[i - k - 1])
		{
			flag = false;
			break;
		}
	return flag;
}

  最后就是说一下itoa这个函数,百度到的,感觉挺好用,以为这么就过了,但是网站是返回wa的。如果是正式的比赛应该可以使用。

函数原型是char *itoa(int value, char *string, int radix);
       value: 待转化的整数
     radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36
     *string: 保存转换后得到的字符串
     返回值:同*string

  它还有其他的一些变形,比如整数数范围可以是long等等。

  本题写的脑残代码如下,供参考:

/*
ID: like_091
PROG: palsquare
LANG: C++
*/
#include<iostream>
#include<fstream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;

//判断是否是回文串
bool pal(int s[], int n)
{
	bool flag = true;
	for (int i = 0; i < n; i++)
		if (s[i] != s[n - i - 1])
		{
			flag = false;
			break;
		}
	return flag;
}
int change(int n[], int x, int t)
{
	int k = 0;
	while (x > 0)
	{
		n[k++] = x % t;
		x /= t;
	}
	return k;
}
int main(void)
{
	ifstream cin("palsquare.in");
	ofstream cout("palsquare.out");
	int x;
	while (cin>>x)
	{
		for (int i = 1; i <= 300; i++)
		{
			int num[20];
			int t = change(num, i * i, x);
			if (pal(num, t))
			{
				int fun[20];
				int y = change(fun, i, x);
				for (int i = y - 1; i >= 0; i--)
				{
					if (fun[i] >= 0 && fun[i] <= 9)
						cout<<fun[i];
					else cout<<char(fun[i] + 'A' - 10);
				} 
				cout<<" ";
				for (int i = 0; i < t; i++)
				{
					if (num[i] >= 0 && num[i] <= 9)
						cout<<num[i];
					else cout<<char(num[i] + 'A' - 10);
				}
				cout<<endl;
			}
		}
	}
	return 0;
}


转载于:https://www.cnblogs.com/neulike/archive/2011/02/19/1958793.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值